0

我正在尝试根据某个日期和国家/地区名称过滤数据框。我已经提取了我希望最终数据框包含的列。我还创建了一个我想要过滤的国家/地区名称列表。

cols_to_keep = projects[['regionname', 'countryname', 'lendinginstr', 'totalamt', 'boardapprovaldate','location', 'GeoLocID', 'GeoLocName','Latitude', 'Longitude', 'Country', 'project_name']]
countries = ['Bosnia', 'Herzegovina', 'Croatia', 'Kosovo', 'Macedonia', 'Serbia', 'Slovenia']

然后我尝试过滤我想要的日期,即 1992 年 4 月 27 日。

projects['boardapprovaldate'] < pd.Timestamp(datetime.date(1992,4,27))

然后我尝试通过执行以下操作对我想要的国家名称应用日期过滤器:

cols_to_keep[(cols_to_keep['boardapprovaldate'] < pd.Timestamp(datetime.date(1992,4,27))) & 
             (cols_to_keep['countryname'].isin(countries))].sort_values('boardapprovaldate')

当我应该有 12 行时,它只显示 2 行

在此处输入图像描述

但是,如果我尝试

str.contains() 而不是 isin()

方法我可以检索到我想要的正确结果。

projects[(projects['boardapprovaldate'] < pd.Timestamp(datetime.date(1992,4,27))) & 
         ((projects['countryname'].str.contains('Bosnia')) | 
         (projects['countryname'].str.contains('Croatia')) | 
         (projects['countryname'].str.contains('Kosovo')) | 
         (projects['countryname'].str.contains('Macedonia')) | 
         (projects['countryname'].str.contains('Montenegro')) | 
         (projects['countryname'].str.contains('Serbia')) | 
         (projects['countryname'].str.contains('Slovenia')))][
    ['regionname', 
     'countryname', 
     'lendinginstr', 
     'totalamt', 
     'boardapprovaldate',
     'location', 
     'GeoLocID', 
     'GeoLocName',
     'Latitude', 
     'Longitude', 
     'Country', 
     'project_name']].sort_values('boardapprovaldate')

在此处输入图像描述

有人可以解释一下差异以及为什么会这样吗?

4

1 回答 1

1

使用isin相等性检查。因此,不在您countries列表中的“波斯尼亚和黑塞哥维那”等值将不匹配。

使用contains子字符串检查。“波斯尼亚”是“波斯尼亚和黑塞哥维那”的子串。

例子:
srs = pd.Series(["Bosnia and Herzegovina", "Bosnia"])
>>> srs.isin(["Bosnia"])
0    False
1    True
dtype: bool

>>> srs.str.contains("Bosnia")
0     True
1     True
dtype: bool
于 2021-07-21T17:14:40.060 回答