如何合并熊猫数据框中的两列,堆叠在顶部

Muz*_*uzz 1 python dataframe pandas

我有一个这样的数据框:

df1
  sample x data       data y
         b              a
         d              c
         f              e
         h              g
         j              i
         l              k
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 5

str.split按列名使用,然后通过重新整形DataFrame.unstack,最后通过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
Run Code Online (Sandbox Code Playgroud)

编辑:

如果使用,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
Run Code Online (Sandbox Code Playgroud)

所以你可以提取值xy

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
Run Code Online (Sandbox Code Playgroud)