Pandas 过滤多列多行
Pandas filtering on multiple columns and rows
我正在尝试根据特定日期和国家/地区名称过滤数据框。我已经提取了我希望最终数据框包含的列。我还创建了一个要过滤的国家名称列表。
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() instead of 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')
有人可以解释一下区别以及为什么会这样吗?
使用isin
检查是否相等。因此,不在您的 countries
列表中的“波斯尼亚和黑塞哥维那”等值将不匹配。
使用 contains
检查子字符串。 "Bosnia" 是 "Bosnia and Herzegovina" 的子字符串。
示例:
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
我正在尝试根据特定日期和国家/地区名称过滤数据框。我已经提取了我希望最终数据框包含的列。我还创建了一个要过滤的国家名称列表。
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() instead of 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')
有人可以解释一下区别以及为什么会这样吗?
使用isin
检查是否相等。因此,不在您的 countries
列表中的“波斯尼亚和黑塞哥维那”等值将不匹配。
使用 contains
检查子字符串。 "Bosnia" 是 "Bosnia and Herzegovina" 的子字符串。
示例:
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