我有一个这样的数据框:

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


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

最佳答案

通过列名称使用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


编辑:

如果使用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


因此,您可以提取值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

关于python - 如何在 Pandas 数据框中合并两列,堆叠在顶部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59320246/

10-09 17:08
查看更多