Pandas DataFrame стек несколько значений столбцов в один столбец
предполагая следующий фрейм данных:
key.0 key.1 key.2 topic
1 abc def ghi 8
2 xab xcd xef 9
Как я могу объединить значения всех ключевых.* столбцы в один столбец "ключ", который связан со значением темы, соответствующим ключу.* колонки? Это результат, который я хочу:
topic key
1 8 abc
2 8 def
3 8 ghi
4 9 xab
5 9 xcd
6 9 xef
обратите внимание, что номер ключа.N столбцов является переменной на некотором внешнем N.
3 ответов
вы можете расплавить свой фрейм данных:
>>> 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
класс:
>>> 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