假设我有这个数据框:
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 方法,但没有成功...
请您参考如下方法:
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, 一些东西,需要这样
desired = something.pivot(index='index', columns='cols')
通过查看 other examples 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 缺少。
