如何在一个数据框中合并两列,堆叠在顶部

2024-04-27 03:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

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

这能在熊猫身上实现吗?这就像把一列叠在另一列上,但要记录下这列是什么类型的信息。非常感谢。你知道吗


Tags: 数据sample信息类型datainformation记录df1
2条回答

按列名使用^{},然后按^{}重塑,最后按^{}清理数据:

#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

我认为这种方法非常直观:

1)拆分列并创建一个新的dataframe,其中x\u data和'x'的值作为另一列的标识符(与'y\u data'相同)

dx = pd.DataFrame(zip(df['x_data'].values.tolist(),['x']*(len(df['x_data'].values.tolist()))),columns=['data','identifier'])
dy = pd.DataFrame(zip(df['y_data'].values.tolist(),['y']*(len(df['y_data'].values.tolist()))),columns=['data','identifier'])

考虑一下这段代码:

zip(df['x_data'].values.tolist(),['x']*(len(df['x_data'].values.tolist())))

我们在这里要做的是制作两个列表:第一个是x\u数据值的列表;第二个是x\u数据中每个元素重复x的列表 使用zip,我们将它们转换为一个列表,并使用pd.数据帧([列表,列])生成数据帧dx

2)连接数据帧以交付具有预期格式的单个数据帧

df = pd.concat([dx,dy])

print(df)
data identifier
0    b          x
1    d          x
2    f          x
3    h          x
4    j          x
5    l          x
6    x          x
0    a          y
1    c          y
2    e          y
3    g          y
4    i          y
5    k          y

相关问题 更多 >