Skip to main content
 首页 » 编程设计

python之如何创建相应的列

2025年05月04日10jillzhang

我得到的数据是这样的:

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'哪个>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  
.... 

感谢您的帮助!

请您参考如下方法:

  • 我要使用 np.sign在 data_01.a - 3
    • 返回 -1什么时候< 3 , 0什么时候== 3 , 和 1什么时候> 3
  • 然后我将它们用作标签数组的索引

    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生成虚拟列。我创建字典将假人绑定(bind)到标签并将字典传递给 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