Python 在“String”类型的pd.dataframe上使用iloc时,字符串比较始终为false
我的项目遇到了一些问题,因为当我尝试比较两个字符串(一个来自pandas数据帧,一个来自代码)时,会出现意外行为。 我在pandas数据框中加载了列:[“国家”,“地区”,“城市”,“人口”,“新冠病毒病例],以找到最后两个变量之间的最终相关性 df=pd.DataFramecolumns=[“国家”、“地区”、“城市”、“人口”、“案例”] 我想将给定区域的所有人口(例如意大利南部)保存在一个列表中,以绘制该区域,因此我使用列表理解功能进行了此操作: 如果strdf.iloc[i][0]='Italy' 如果strdf.iloc[i][1]==='Sicilia'] 结果是,第二个“if”语句似乎始终为false,给了我一个空列表,这与我在用单词“Sicilia”打印Region列的所有元素时进行的小调试不同:Python 在“String”类型的pd.dataframe上使用iloc时,字符串比较始终为false,python,pandas,dataframe,Python,Pandas,Dataframe,我的项目遇到了一些问题,因为当我尝试比较两个字符串(一个来自pandas数据帧,一个来自代码)时,会出现意外行为。 我在pandas数据框中加载了列:[“国家”,“地区”,“城市”,“人口”,“新冠病毒病例],以找到最后两个变量之间的最终相关性 df=pd.DataFramecolumns=[“国家”、“地区”、“城市”、“人口”、“案例”] 我想将给定区域的所有人口(例如意大利南部)保存在一个列表中,以绘制该区域,因此我使用列表理解功能进行了此操作: 如果strdf.iloc[i][0]='I
Region type: <class 'str'>
---
Puglia Sicilia
Lombardia Sicilia
Emilia Sicilia
Sicilia Sicilia <--
Toscana Sicilia
Veneto Sicilia
Veneto Sicilia
我还尝试将if语句与关键字连接起来,并获得相同的结果。
为什么会发生这种情况
更新:
谢谢大家的回答。通过阅读WGP的答案,我发现我的数据集在所有区域名称之前都有一个空格,因此甚至没有阅读单词!我还尝试了Gergely的方法,尽管数据集中有很多空间,但它仍然有效。谢谢大家!: 我不知道这是否是您的问题,因为我不确定您的数据帧到底是什么样子,因为我只有您给我的代码中的列。但看起来你所在的地区绝不仅仅是西西里岛,它前面似乎有一个词,在这种情况下,你的第二个if语句将始终返回false 我想你想把它改成类似
pop_sud = [
int(df.iloc[i][3])
for i in range(len(df.index))
if str(df.iloc[i][0])=='Italy'
if df['Region'].str.contains('Sicilia')[i]
]
您也可以在不理解列表的情况下执行此操作,代码如下所示
pop_sud = df.query(
"Country == 'Italy' &
Region.str.contains('Sicilia')"
)['Cases'].astype(int).tolist()
我不知道这是否是您的问题,因为我不确定您的数据帧到底是什么样子,因为我只有您给我的代码中的列。但看起来你所在的地区绝不仅仅是西西里岛,它前面似乎有一个词,在这种情况下,你的第二个if语句将始终返回false 我想你想把它改成类似
pop_sud = [
int(df.iloc[i][3])
for i in range(len(df.index))
if str(df.iloc[i][0])=='Italy'
if df['Region'].str.contains('Sicilia')[i]
]
您也可以在不理解列表的情况下执行此操作,代码如下所示
pop_sud = df.query(
"Country == 'Italy' &
Region.str.contains('Sicilia')"
)['Cases'].astype(int).tolist()
尝试按布尔索引筛选: 这篇文章用很好的例子详细地解释了这一点: 因此,如果您有此数据集:
nested_lists = [
['Country1', 'Region1', 'City1', 1, 5],
['Country1', 'Region1', 'City2', 7, 8],
['Country1', 'Region2', 'City3', 3, 4],
['Country2', 'Region2', 'City4', 6, 8]
]
df = pandas.DataFrame(nested_lists, columns = ['Country', 'Region', 'City', 'Population', 'Cases'])
您可以通过以下方式按国家和地区进行筛选:
df_filtered = df[(df['Country'] == 'Country1') & (df['Region'] == 'Region1')]
结果:
Country Region City Population Cases
Country1 Region1 City1 1 5
Country1 Region1 City2 7 8
Cases
5
8
要仅获取“案例”列,请执行以下操作:
df_filtered2 = df[(df['Country'] == 'Country1') & (df['Region'] == 'Region1')][['Cases']]
结果:
Country Region City Population Cases
Country1 Region1 City1 1 5
Country1 Region1 City2 7 8
Cases
5
8
尝试按布尔索引筛选: 这篇文章用很好的例子详细地解释了这一点: 因此,如果您有此数据集:
nested_lists = [
['Country1', 'Region1', 'City1', 1, 5],
['Country1', 'Region1', 'City2', 7, 8],
['Country1', 'Region2', 'City3', 3, 4],
['Country2', 'Region2', 'City4', 6, 8]
]
df = pandas.DataFrame(nested_lists, columns = ['Country', 'Region', 'City', 'Population', 'Cases'])
您可以通过以下方式按国家和地区进行筛选:
df_filtered = df[(df['Country'] == 'Country1') & (df['Region'] == 'Region1')]
结果:
Country Region City Population Cases
Country1 Region1 City1 1 5
Country1 Region1 City2 7 8
Cases
5
8
要仅获取“案例”列,请执行以下操作:
df_filtered2 = df[(df['Country'] == 'Country1') & (df['Region'] == 'Region1')][['Cases']]
结果:
Country Region City Population Cases
Country1 Region1 City1 1 5
Country1 Region1 City2 7 8
Cases
5
8
看看这个问题的最上面的答案:,我想这对你会有帮助。我一眼就看不出是什么导致了错误,但这不是从数据帧中选择的好方法。您可以尝试使用df[df.Country=='Italy'和df.Region=='Sicilia','Cases',并避免循环。对于调试,我建议键入df.Region=='Sicilia'并查看结果。它应该是一个布尔级数,只有一个为真,其余为假。请看一下这个问题的最上面的答案:,我认为这会对您有所帮助。我乍一看不出是什么导致了错误,但这不是从数据帧中选择的好方法。您可以尝试使用df[df.Country=='Italy'和df.Region=='Sicilia','Cases',并避免循环。对于调试,我建议键入df.Region=='Sicilia'并查看结果。它应该是一个布尔级数,只有一个为真,其余为假。