首页 > 解决方案 > 使用字符串列表或字典根据数据框中的现有列创建新列

问题描述

我目前在我的数据框中的一列中有一组值。这些值没有特定的模式,并且在大多数情况下是随机的,但我想设置自己的字典或列表,因此如果字符串包含这些值,我可以创建一个新列来匹配这些关键字。我来自 R 背景,所以我之前所做的是创建一个 for 循环,用 grepl 解包 a 列表。

假设我有字典:

我的字典:

my_dict = {"BC": "Vancouver", "AB": "Calgary", "SK": ["Regina","Saskatoon"], "MB": ["Winnipeg","Brandon"], "ON":["Toronto","Ottawa"]}

本质上,我想要的是如果字符串匹配,然后使用字典的键。此外,如果他们碰巧不匹配或字典中未列出密钥,则将输入“其他”。这是我想看到的。

东风:

df = pd.DataFrame({"Name": ["Jordan","Paul","Adrian","Sarah","Becky","Shawn"], "City":["Vancouver - Lower Mainland","Calgary/Lethbridge","Regina / Moose Jaw","Brandon","Ottawa_Hamilton","Montreal"],
                "Province_Fixed": ["BC","AB","SK","MB","ON","Other"]})

“Provinced_Fixed”列将是输出。我想知道哪种方法是解决这个问题的最佳方法。为了这个问题,我只是给了一本字典,它不需要以这种方式完成。非常感谢!我非常感激。

标签: pythonpython-3.xpandasdataframe

解决方案


Lopp 按字典值创建新列,所有行都匹配 by str.contains,对于lists 也是必要的,将值连接到一个字符串 by|正则表达式OR

for k, v in my_dict.items():
    pat = '|'.join(v) if isinstance(v, list) else v
    df.loc[df['City'].str.contains(pat) , 'new'] = k

df['new'] = df['new'].fillna('Other')
print (df)
     Name                        City Province_Fixed    new
0  Jordan  Vancouver - Lower Mainland             BC     BC
1    Paul          Calgary/Lethbridge             AB     AB
2  Adrian          Regina / Moose Jaw             SK     SK
3   Sarah                     Brandon             MB     MB
4   Becky             Ottawa_Hamilton             ON     ON
5   Shawn                    Montreal          Other  Other

推荐阅读