读取带有列表的熊猫列以创建新的分类列

时间:2019-03-14 14:42:41

标签: python pandas list dataframe

我有一列这样的字符串

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)

现在我知道上面的代码将不起作用(因为它是胡说),但是我之前曾使用过类似的功能来对性别列进行分类,但是,我似乎无法对此代码有所了解一。

与往常一样,感谢您提供的任何帮助。

4 个答案:

答案 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.mapstr.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)