Pandas DataFrame 将多列值堆叠到单列中

Posted

技术标签:

【中文标题】Pandas DataFrame 将多列值堆叠到单列中【英文标题】:Pandas DataFrame stack multiple column values into single column 【发布时间】:2016-03-26 08:51:18 【问题描述】:

假设如下DataFrame:

  key.0 key.1 key.2  topic
1   abc   def   ghi      8
2   xab   xcd   xef      9

如何将所有 key.* 列的值组合成单个列“key”,该列与 key.* 列对应的主题值相关联?这是我想要的结果:

   topic  key
1      8  abc
2      8  def
3      8  ghi
4      9  xab
5      9  xcd
6      9  xef

请注意,key.N 列的数量在某些外部 N 上是可变的。

【问题讨论】:

【参考方案1】:

你可以融化你的数据框:

>>> keys = [c for c in df if c.startswith('key.')]
>>> pd.melt(df, id_vars='topic', value_vars=keys, value_name='key')

   topic variable  key
0      8    key.0  abc
1      9    key.0  xab
2      8    key.1  def
3      9    key.1  xcd
4      8    key.2  ghi
5      9    key.2  xef

它还为您提供了密钥的来源。


v0.20meltpd.DataFrame 类的第一类函数:

>>> df.melt('topic', value_name='key').drop('variable', 1)

   topic  key
0      8  abc
1      9  xab
2      8  def
3      9  xcd
4      8  ghi
5      9  xef

【讨论】:

【参考方案2】:

好的,因为当前答案之一被标记为与此问题重复,我将在这里回答。

通过使用wide_to_long

pd.wide_to_long(df, ['key'], 'topic', 'age').reset_index().drop('age',1)
Out[123]: 
   topic  key
0      8  abc
1      9  xab
2      8  def
3      9  xcd
4      8  ghi
5      9  xef

【讨论】:

【参考方案3】:

在尝试了各种方法后,我发现以下内容或多或少是直观的,前提是了解stack的魔力:

# keep topic as index, stack other columns 'against' it
stacked = df.set_index('topic').stack()
# set the name of the new series created
df = stacked.reset_index(name='key')
# drop the 'source' level (key.*)
df.drop('level_1', axis=1, inplace=True)

根据需要生成的数据框:

   topic  key
0      8  abc
1      8  def
2      8  ghi
3      9  xab
4      9  xcd
5      9  xef

您可能需要打印中间结果以全面了解该过程。如果您不介意列数超出所需,关键步骤是set_index('topic')stack()reset_index(name='key')

【讨论】:

我似乎找不到关于 name 参数的任何文档 reset_index,你能解释一下它是如何工作的吗? 是Series.reset_index()

以上是关于Pandas DataFrame 将多列值堆叠到单列中的主要内容,如果未能解决你的问题,请参考以下文章

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe(不设置参数n则列表长度不同较短的列表会出现缺失值)

根据堆叠条件为具有层次索引的 pandas DataFrame 赋值

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python

将 Pandas 单元格中的列表拆分为多列 [重复]

将多列数据移动到左侧Pandas Dataframe [重复]

pandas 获得两列或多列的逐行最小值