我的数据看起来像这样
Weight Sex
91.0 male
91.0 male
131.0 female
128.0 female
132.0 female
150.0 male
我想要类似
male female
91.0 0
91.0 0
0 131.0
0 128.0
0 132.0
150.0 0
如何不使用pd.wide_to_long()函数来实现这一目标。
答案 0 :(得分:4)
使用不带index
参数的DataFrame.pivot
,然后用DataFrame.fillna
替换缺少的值:
df = df.pivot(columns='Sex', values='Weight').fillna(0)
print (df)
Sex female male
0 0.0 91.0
1 0.0 91.0
2 131.0 0.0
3 128.0 0.0
4 132.0 0.0
5 0.0 150.0
使用DataFrame.set_index
和Series.unstack
的另一种解决方案:
df = df.set_index('Sex', append=True)['Weight'].unstack(fill_value=0)
print (df)
Sex female male
0 0.0 91.0
1 0.0 91.0
2 131.0 0.0
3 128.0 0.0
4 132.0 0.0
5 0.0 150.0
如果列的顺序很重要,请添加子集:
df = df.pivot(columns='Sex', values='Weight').fillna(0)[['male','female']]
print (df)
Sex male female
0 91.0 0.0
1 91.0 0.0
2 0.0 131.0
3 0.0 128.0
4 0.0 132.0
5 150.0 0.0