2014-02-07 130 views
2

比方说,我有这样的数据帧:重塑数据帧

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 

我一直在​​和玩弄stack/unstack方法,但没有成功...

回答

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 

如果你关心的ORD在多指标列标签的呃,你可以使用 栈和出栈,以精确地再现结果你贴:

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。接下来的问题是, something,所需要的数据帧,使

desired = something.pivot(index='index', columns='cols') 

通过观察在行动pivotother examples,显然比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缺乏。

+0

感谢伟大的解释! – HappyPy

0

您可以使用DataFrame.groupbyDataFrame.reset_indexDataFrame.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 

希望它能帮助,:)