假设我有这个数据框:
df = pd.DataFrame({'n':[0 ,1 ,0 ,0 ,1 ,1 ,0 ,1],'l':[12 ,16 ,92, 77 ,32 ,47, 22, 14], 'cols':['col1','col1','col1','col1','col2','col2','col2','col2']})
这就是我想要的:
col1 col2
l n l n
12 0 32 1
16 1 47 1
92 0 22 0
77 0 14 1
我一直在使用set_index
和stack
/ unstack
方法,但没有成功......
答案 0 :(得分:1)
import pandas as pd
df = pd.DataFrame(
{'n':[0 ,1 ,0 ,0 ,1 ,1 ,0 ,1],'l':[12 ,16 ,92, 77 ,32 ,47, 22, 14],
'cols':['col1','col1','col1','col1','col2','col2','col2','col2']})
df['index'] = df.groupby(['cols']).cumcount()
result = df.pivot(index='index', columns='cols')
print(result)
# l n
# cols col1 col2 col1 col2
# index
# 0 12 32 0 1
# 1 16 47 1 1
# 2 92 22 0 0
# 3 77 14 0 1
如果您关心MultiIndex列中标签的顺序,则可以使用 堆叠和取消堆叠以准确再现您发布的结果:
result = result.stack(level=0).unstack(level=1)
print(result)
# cols col1 col2
# l n l n
# index
# 0 12 0 32 1
# 1 16 1 47 1
# 2 92 0 22 0
# 3 77 0 14 1
在寻找解决方案时,向后思考通常很有用。
从所需的DataFrame开始,问问自己可能的操作
得到所需的DataFrame。在这种情况下,想到的操作
是pd.pivot
。然后问题变成,DataFrame是什么,
需要something
,以便
desired = something.pivot(index='index', columns='cols')
通过查看pivot
something
的实际情况,显然比 cols l n index
0 col1 12 0 0
1 col1 16 1 1
2 col1 92 0 2
3 col1 77 0 3
4 col2 32 1 0
5 col2 47 1 1
6 col2 22 0 2
7 col2 14 1 3
必须等于
df
然后你会看到是否可以找到一种方法来再次按something
进入something
,或
向后工作,按df
进入something
...从这个角度来看,在
在这种情况下,缺失的链接变得明显:index
有一个df
列
{{1}}缺少的。
答案 1 :(得分:0)
您可以结合使用DataFrame.groupby
,DataFrame.reset_index
和DataFrame.T
(转置)
import pandas as pd
df = pd.DataFrame({'n':[0 ,1 ,0 ,0 ,1 ,1 ,0, 1],'l':[12 ,16 ,92, 77 ,32 ,47, 22, 14], 'cols':['col1','col1','col1','col1','col2','col2','col2','col2']})
print df.groupby('cols').apply(lambda x: x.reset_index(drop=True).drop('cols',axis=1).T).T
输出:
cols col1 col2
l n l n
0 12 0 32 1
1 16 1 47 1
2 92 0 22 0
3 77 0 14 1
或者您可以使用concat
:
print pd.concat([g.drop('cols',axis=1).reset_index(drop=True) for _,g in df.groupby('cols')],axis=1,keys=df['cols'].unique())
输出:
col1 col2
l n l n
0 12 0 32 1
1 16 1 47 1
2 92 0 22 0
3 77 0 14 1
希望它有所帮助,:))