使用字符串列表过滤数据框

3

我有以下名为pop_df的数据帧:

pop_df
Out[33]: 
            2014       2015       2016       2017       2018       2019
Geo                                                                    
AL     2892394.0  2885796.0  2875592.0  2876591.0  2870324.0  2862427.0
AL0    2892394.0  2885796.0  2875592.0  2876591.0  2870324.0  2862427.0
AL01    844921.0   836448.0   830981.0   826904.0   819793.0   813758.0
AL011   134332.0   131054.0   129056.0   125579.0   120978.0   118948.0
AL012   276058.0   277989.0   280205.0   284823.0   289626.0   290126.0
         ...        ...        ...        ...        ...        ...
UKN12   142028.0   142756.0   143363.0   143746.0   144105.0   144367.0
UKN13   139774.0   140222.0   140752.0   141368.0   141994.0   142565.0
UKN14   137722.0   139426.0   140691.0   141917.0   143286.0   144771.0
UKN15   136332.0   136904.0   137492.0   138000.0   138441.0   138948.0
UKN16   114696.0   115171.0   115581.0   116057.0   116612.0   117051.0

[2034 rows x 6 columns]

我还有一个欧盟国家代码列表:

EuropeanUnion=["BE","BG","CZ","DK","DE","EE","IE","EL","ES","FR","HR","IT","CY","LV","LT","LU","HU","MT","NL","AT","PL","PT","RO","SI","SK","FI","SE"]

我希望筛选出仅包含列表中国家代码开头的行,我尝试使用pop_df.index.str.startswith,但无法使其正常工作。非常感谢您提供的任何帮助。谢谢!
2个回答

3

看起来 Geo 是索引,所以你可以这样做:

result = df[df.index.str.match(rf'\b{"|".join(EuropeanUnion)}')]

输出 (虚拟)

           2014      2015      2016      2017      2018      2019
Geo                                                              
BE011  134332.0  131054.0  129056.0  125579.0  120978.0  118948.0
DE13   139774.0  140222.0  140752.0  141368.0  141994.0  142565.0

str.match 的文档中可以得知:

判断每个字符串是否以正则表达式的匹配开始。

表达式 rf'\b{"|".join(EuropeanUnion)}' 会生成一个正则表达式模式,用于匹配任何国家代码。


2
我建议您使用切片索引(作为字符串)来获取前两个字母,并将 Pandas 的 .isin 方法 应用于国家代码变量,以生成布尔掩码:
eu_countries_filtered = pop_df[pop_df.index.str[:2].isin(EuropeanUnion)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接