我有一列这样的字符串
col_1
Spiderman
Abe Lincoln
Superman
Ghandi
Jane Austin
Robert de Niro
Elon Musk
George Bush
Bill Gates
Barak Obama
Anne Frank
我手动浏览了该列并列出了这些字符的类别列表:
l1 = [ 'Abe Lincoln', 'George Bush', 'Barak Obama']
l2 = ['Spiderman', 'Superman']
l3 = ['AnneFrank', 'Ghandi']
我已经列出了这些列表
dict = {'l1': l1, 'l2': l2,'l3': l3} #and so on
我想做的是通过读取第1列来创建一个新列,并根据str(cell)出现在哪个列表中来返回一个数字;所以输出应该是
col_1 col2
Spiderman 2
Abe Lincoln 1
Superman 2
Ghandi 3
Jane Austin 4
Robert de Niro 4
Elon Musk 4
George Bush 1
Bill Gates 4
Barak Obama 1
Anne Frank 3
我只是不确定如何使用if / else在定义的函数中使用列表和字典,我什至不确定是否需要该字典,但我认为是的。
我尝试过类似的事情
def group(x, dict):
for key, value in dict:
if x in key:
return 1
else:
return 0
data [“ group”] = data.col1.apply(group)
现在我知道上面的代码将不起作用(因为它是胡说),但是我之前曾使用过类似的功能来对性别列进行分类,但是,我似乎无法对此代码有所了解一。
与往常一样,感谢您提供的任何帮助。
答案 0 :(得分:5)
我认为您需要按字典循环,并用Series.isin
设置key
的值以作为检查成员资格-在示例数据中获得NaN
s,因为在字典中缺少另一个值:>
#not use python reserved word dict for variable name
d = {'l1': l1, 'l2': l2,'l3': l3}
for k, v in d.items():
df.loc[df['col_1'].isin(v), 'new'] = k
print (df)
col_1 new
0 spiderman l2
1 Abe Lincoln l1
2 superman l2
3 Ghandi l3
4 Jane Austin NaN
5 Robert de Niro NaN
6 Elon Musk NaN
7 George Bush l1
8 Bill Gates NaN
9 Barak Obama l1
10 Anne Frank NaN
答案 1 :(得分:2)
重组dict
并使用Series.map
和str.extract
。
在此示例中,我将dict
重命名为my_dict
。使用'dict'作为名称是一个坏主意。
remapped_dict = {i: k for k, v in my_dict.items() for i in v}
df['col_2'] = df['col_1'].map(remapped_dict).str.extract(r'(\d+)')
[出]
col_1 col_2
0 Spiderman 2
1 Abe Lincoln 1
2 Superman 2
3 Ghandi 3
4 Jane Austin NaN
5 Robert de Niro NaN
6 Elon Musk NaN
7 George Bush 1
8 Bill Gates NaN
9 Barak Obama 1
10 Anne Frank NaN
答案 2 :(得分:1)
将您的ring()
放平,然后我们进行dict
,也不要将您的字典命名为map
dict
答案 3 :(得分:1)
相同的解决方案
def func(x):
if x in l1:
return 1
if x in l2:
return 2
else:
return 3
df['col2'] = df['col1'].apply(func)