Skip to main content
 首页 » 编程设计

python之如何合并 pandas 数据框中的两列,堆叠在顶部

2025年05月04日22cmt

我有一个这样的数据框:

df1 
  sample x data       data y 
         b              a 
         d              c 
         f              e 
         h              g 
         j              i 
         l              k 

我需要像这样创建一个新的数据框:

information  identifier 
b       x 
d       x 
f       x 
h       x 
j       x 
l       x 
a       y 
c       y 
e       y  
g       y 
i       y 
k       y 

这可以在 pandas 中完成吗?这就像将一列堆叠在另一列之上,但记录该列的信息类型。非常感谢。

请您参考如下方法:

使用str.split按列名,然后按 DataFrame.unstack reshape , 最后一些数据清理 DataFrame.reset_index :

#first data solution 
df.columns = df.columns.str.split('_', expand=True) 
df = (df.unstack() 
       .reset_index(level=[1,2], drop=True) 
       .rename_axis('identifier') 
       .reset_index(name='data')[['data','identifier']]) 
print (df) 
   data identifier 
0     b          x 
1     d          x 
2     f          x 
3     h          x 
4     j          x 
5     l          x 
6     a          y 
7     c          y 
8     e          y 
9     g          y 
10    i          y 
11    k          y 

编辑:

如果使用 melt 然后列名创建新列:

df = df.melt(var_name='identifier', value_name='information') 
print (df) 
       identifier information 
0   sample x data           b 
1   sample x data           d 
2   sample x data           f 
3   sample x data           h 
4   sample x data           j 
5   sample x data           l 
6          data y           a 
7          data y           c 
8          data y           e 
9          data y           g 
10         data y           i 
11         data y           k 

因此您可以提取值 x 和 y:

df.columns = df.columns.str.extract('(x|y)', expand=False) 
df = df.melt(var_name='identifier', value_name='information') 
print (df) 
   identifier information 
0           x           b 
1           x           d 
2           x           f 
3           x           h 
4           x           j 
5           x           l 
6           y           a 
7           y           c 
8           y           e 
9           y           g 
10          y           i 
11          y           k