重塑熊猫中的数据框架

时间:2014-02-07 20:49:21

标签: python pandas dataframe reshape

假设我有这个数据框:

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_indexstack / unstack方法,但没有成功......

2 个答案:

答案 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.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

希望它有所帮助,:))

相关问题