在“String”类型的pd.dataframe上使用iloc时,字符串比较始终为false

2024-10-08 19:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目遇到了一些问题,因为当我尝试比较两个字符串(一个来自pandas数据帧,一个来自代码)时,会出现意外行为。 我在pandas数据框中加载了列:[“国家”,“地区”,“城市”,“人口”,“新冠病毒病例],以找到最后两个变量之间的最终相关性

df = pd.DataFrame(columns = ['Country','Region','City','Population','Cases'])

我想将给定区域(例如意大利南部)的所有人口保存在一个列表中,以绘制该区域,因此我使用列表理解来完成此操作:

pop_sud = [int(df.iloc[i][3]) for i in range(len(df.index)) if str(df.iloc[i][0])=='Italy' 
if str(df.iloc[i][1])=='Sicilia']

结果是,第二个“if”语句似乎始终为false,给了我一个空列表,这与我在用单词“Sicilia”打印Region列的所有元素时进行的小调试不同:

 Region type: <class 'str'>
 ---
 Puglia Sicilia
 Lombardia Sicilia
 Emilia Sicilia
 Sicilia Sicilia <--
 Toscana Sicilia
 Veneto Sicilia
 Veneto Sicilia

我也尝试过这个版本,但仍然给我一个空列表,因为if检查没有通过:

cases_sud = [int(df.iloc[i][4]) for i in range(len(df.index)) if df.iloc[i][0] == 'Italy' 
if df.loc[i][1] in ['Sicilia','Puglia','Campania']]

我还尝试将if语句与关键字and连接起来,以获得相同的结果。 为什么会发生这种情况

更新
谢谢大家的回答。通过阅读WGP的答案,我发现我的数据集在所有区域名称之前都有一个空格,因此甚至没有阅读单词!我还尝试了Gergely的方法,尽管数据集中有很多空间,但它仍然有效。谢谢大家!:)


Tags: 数据in区域pandasdf列表forif
2条回答

尝试按“布尔索引”筛选:

https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#boolean-indexing

这篇文章用很好的例子详细地解释了这一点:

https://appdividend.com/2019/01/25/pandas-boolean-indexing-example-python-tutorial/

因此,如果您有此数据集:

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

要仅获取“案例”列,请执行以下操作:

df_filtered2 = df[(df['Country'] == 'Country1') & (df['Region'] == 'Region1')][['Cases']]

结果:

Cases
5
8

我不知道这是否是您的问题,因为我不确定您的数据帧到底是什么样子,因为我只有您给我的代码中的列。但是看起来你的区域从来就不是Sicilia,它前面似乎有一个单词,在这种情况下,你的第二个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()

相关问题 更多 >

    热门问题