Pandas DataFrame 将多个列值堆叠到单个列中
Pandas DataFrame stack multiple column values into single column
假设以下数据帧:
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 上是可变的。
你可以融化你的数据框:
>>> 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.20
开始,melt
是 pd.DataFrame
的第一个 class 函数 class:
>>> 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
在尝试了各种方法后,我发现以下内容或多或少是直观的,前提是理解 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')
.
好的,因为当前答案之一被标记为与此问题重复,我将在这里回答。
通过使用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
假设以下数据帧:
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 上是可变的。
你可以融化你的数据框:
>>> 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.20
开始,melt
是 pd.DataFrame
的第一个 class 函数 class:
>>> 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
在尝试了各种方法后,我发现以下内容或多或少是直观的,前提是理解 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')
.
好的,因为当前答案之一被标记为与此问题重复,我将在这里回答。
通过使用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