【问题标题】:pandas: concat data frame with different column namepandas:具有不同列名的 concat 数据框
【发布时间】:2015-12-15 06:57:40
【问题描述】:

假设我有这个数据框

id   x   y
0    a   hello
0    b   test
1    c   hi
2    a   hi
3    d   bar

我想像这样将 x 和 y 连接到一个单独的列中,并保留它们的 ID

id   x
0    a
0    b
1    c
2    a
3    d
0    hello
0    test
1    hi
2    hi
3    bar

如果我想为 concat 列指定一个新名称怎么办? (例如“x”到“xy”)

【问题讨论】:

  • 我不想将我的 id 设置为索引。它仍然应该是一列

标签: python pandas


【解决方案1】:

我认为pandas.concat 不包含设置新的column 名称(see docs) 的选项,但您可以这样分配:

起点:

   id  x      y
0   0  a  hello
1   0  b   test
2   1  c     hi
3   2  a     hi
4   3  d    bar

df.set_index('id', inplace=True)
pd.DataFrame(pd.concat([df.x, df.y]), columns=['xy']).reset_index()

   id     xy
0   0      a
1   0      b
2   1      c
3   2      a
4   3      d
5   0  hello
6   0   test
7   1     hi
8   2     hi
9   3    bar

【讨论】:

  • 我不想将我的 id 设置为索引。它仍然应该是一列
  • 这会产生错误的结果。结果中的 id 列是索引,而不是 id。所以它产生 {'id':[0,1,2,3,4,0,1,2,3,4]}
  • 已更新以希望使步骤更加透明 - 事实上,我确实在 concat 之前将 id 设置为 index
  • 是的。我也打算使用 set_index 。谢谢!
【解决方案2】:

如果行的顺序不重要,可以使用stack

print df
   id  x      y
0   0  a  hello
1   0  b   test
2   1  c     hi
3   2  a     hi
4   3  d    bar

s = df.set_index('id').stack()
s.index = s.index.droplevel(-1)
s.name = 'xy'

print pd.DataFrame(s).reset_index()
   id     xy
0   0      a
1   0  hello
2   0      b
3   0   test
4   1      c
5   1     hi
6   2      a
7   2     hi
8   3      d
9   3    bar

【讨论】:

  • 我不想将我的 id 设置为索引。它仍然应该是一列
  • 然后你可以重置索引。没问题。还是有问题?
  • 是的。这也有效。但我认为 Stefan 的回答要简单得多。
猜你喜欢
  • 2018-01-17
  • 2023-02-08
  • 2019-12-06
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多