我得到的数据是这样的:
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
关于python - 如何创建相应的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46946681/