Skip to main content
 首页 » 编程设计

python之在 Pandas 中 reshape 数据框

2025年05月04日9tuyile006

假设我有这个数据框:

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 缺少。