#python #pandas
Вопрос:
У меня есть фрейм данных следующим образом:
data = {
'Title': ['001C', '001C', '004C', '001C', '004C', '004C', '007C', '010C'],
'Items': ['A', 'B', 'D', 'A', 'A', 'K', 'L', 'M']
}
df = pd.DataFrame(data)
df
Title Items
0 001C A
1 001C B
2 004C D
3 001C A
4 004C A
5 004C K
6 007C L
7 010C M
Я хочу получить Items
под каждым Title
без какой-либо избыточности. Ожидаемый результат составляет
001C 004C 007C 010C
0 A D L M
1 B A
2 K
Ответ №1:
Вы можете drop_duplicates
, assign
вспомогательный столбец с увеличивающимися индексами на элемент в группе, и pivot
:
(df.drop_duplicates(subset=['Title', 'Items'])
.assign(index=df.groupby('Title').cumcount())
.pivot(index='index', columns='Title', values='Items')
.rename_axis(index=None, columns=None)
#.fillna('') # uncomment if you want empty strings in place of NaNs
)
выход:
001C 004C 007C 010C
0 A D L M
1 B A NaN NaN
2 NaN K NaN NaN
Комментарии:
1. ДА. И если нансы побеспокоят операцию, они могут использовать
fillna
.2.
df.columns.name, df.index.name = None, None
если вы хотите точно соответствовать желаемому выходу OP.3. @ddejohn да, вы правы, я обновил сообщение (используя
rename_axis
)
Ответ №2:
Вы также можете использовать .drop_duplicates()
.pivot()
. Затем переместите значения, отличные от NaN , каждого столбца в начало .dropna()
, следующим образом:
(df.drop_duplicates()
.pivot(columns='Title', values='Items')
.apply(lambda x: pd.Series(x.dropna().values))
.rename_axis(columns=None)
)
Результат:
001C 004C 007C 010C
0 A D L M
1 B A NaN NaN
2 NaN K NaN NaN