如何创建对应列

2024-10-06 06:56:02 发布

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

我得到的数据如下:

import pandas as pd

data_dict  = {'a':[5,2,4,5,3,3,1,2,3],
             'name':['Jack','jon',"tom",'lazzy','mack','zack','makilo','drag','maiko']}
data_01 = pd.DataFrame(data_dict)
input:
    a   name
0   5   Jack
1   2   jon
2   4   tom
3   5   lazzy
4   3   mack
5   3   zack
6   1   makilo
7   2   drag
8   3   maiko

我希望输出应该有3列'good','mid','poor',而a >3,==3,<3 预期输出应为:

a name good mid poor
5 Jack 1    0   0
2 jon  0    0   1
4 tom  1    0   0 
5 lazzy 1   0   0
3 mack 0    1   0 
....

谢谢你的帮助!你知道吗


Tags: namedatadictpdzackgoodjacktom
3条回答
  • 我要在data_01.a - 3上使用np.sign
    • < 3时返回-1,当== 3时返回0,当> 3时返回1
  • 然后我使用这些作为标签数组的索引

    labels = np.array(['mid', 'good', 'poor'])
    
  • 当我切片时,0映射到'mid'1映射到'good'-1映射到'poor'

  • 最后,我使用pd.get_dummies创建虚拟列。你知道吗

labels = np.array(['mid', 'good', 'poor'])

data_01.join(pd.get_dummies(labels[np.sign(data_01.a - 3)]))

   a    name  good  mid  poor
0  5    Jack     1    0     0
1  2     jon     0    0     1
2  4     tom     1    0     0
3  5   lazzy     1    0     0
4  3    mack     0    1     0
5  3    zack     0    1     0
6  1  makilo     0    0     1
7  2    drag     0    0     1
8  3   maiko     0    1     0

备选方案1 它使用np.eye来生成虚拟列。我创建dictionary将虚拟对象绑定到标签上,并将dictionary传递给pd.DataFrame.assign

dum = dict(zip(
    ['mid', 'good', 'poor'],
    np.eye(3, dtype=int)[:, np.sign(data_01.a - 3)]
))

data_01.assign(**dum)

   a    name  good  mid  poor
0  5    Jack     1    0     0
1  2     jon     0    0     1
2  4     tom     1    0     0
3  5   lazzy     1    0     0
4  3    mack     0    1     0
5  3    zack     0    1     0
6  1  makilo     0    0     1
7  2    drag     0    0     1
8  3   maiko     0    1     0

备选方案2 我再次使用np.eye,但这次,我从头创建了一个数据帧,并使用pd.DataFrame.join将其附加到data_01

dum = pd.DataFrame(
    np.eye(3, dtype=int)[np.sign(data_01.a - 3)],
    data_01.index, ['mid', 'good', 'poor']
)

data_01.join(dum)

   a    name  mid  good  poor
0  5    Jack    0     1     0
1  2     jon    0     0     1
2  4     tom    0     1     0
3  5   lazzy    0     1     0
4  3    mack    1     0     0
5  3    zack    1     0     0
6  1  makilo    0     0     1
7  2    drag    0     0     1
8  3   maiko    1     0     0

如果需要计数值:

s = np.select([data_01['a'] < 3, data_01['a'] > 3], ['poor','good'], default='mid')

df = data_01.join(data_01.groupby(['name', s]).size().unstack(fill_value=0), on='name')
print (df)
   a    name  good  mid  poor
0  5    Jack     1    0     0
1  2     jon     0    0     1
2  4     tom     1    0     0
3  5   lazzy     1    0     0
4  3    mack     0    1     0
5  3    zack     0    1     0
6  1  makilo     0    0     1
7  2    drag     0    0     1
8  3   maiko     0    1     0

只需与numpy进行一些比较:

arr_a = np.array(a)

good = arr_a > 3
mid  = arr_a == 3
poor = arr_a < 3

然后将这些数组作为列附加到数据帧中。你知道吗

相关问题 更多 >