使用列表读取Pandas中的列以创建新的分类列

2024-06-07 11:03:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一列字符串

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

我只是不知道如何使用列表和dict在一个带有if/else的定义函数中,我甚至不知道我是否需要dict,但我想我需要。你知道吗

我试过类似的方法

def group(x, dict):
    for key, value in dict:
        if x in key:
             return 1
        else:
             return 0

数据[“组”]=数据.col1.应用(组)

现在我知道上面的代码不起作用了(因为这是胡说八道),但我以前用过类似的函数来对性别列进行分类,然而,我似乎无法理解这个列的代码。你知道吗

一如既往,谢谢你的帮助。你知道吗


Tags: l1coldictl3spidermanjanegeorgeobama
3条回答

重新构造你的dict,并使用^{}^{}。你知道吗

注意,在这个例子中,我将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

展平你的dict,然后我们做map,也不要把你的dict命名为dict

from functools import reduce

yourd = reduce(lambda a, b: dict(a, **b), [dict.fromkeys(y,x) for x , y in d.items()])
df['New']=df.col_1.map(yourd)
df
Out[194]: 
             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

我认为您需要按字典循环并将值keys与^{}一起设置,以便在示例数据get NaNs中检查成员身份,因为dict中缺少另一个值:

#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

相关问题 更多 >

    热门问题