#python #pandas
Вопрос:
Мой фрейм данных выглядит следующим образом
selection_id last_traded_price
430494 1.46
430494 1.48
430494 1.56
430494 1.57
430495 2.45
430495 2.67
430495 2.72
430495 2.87
У меня есть много строк, содержащих идентификаторы выбора, и мне нужно сохранить столбец selection_id одинаковым, но перенести данные в последнюю торговую цену, чтобы они выглядели следующим образом.
selection_id last_traded_price
430494 1.46 1.48 1.56 1.57 e.t.c
430495 2.45 2.67 2.72 2.87 e.t.c
Я пробовал использовать ось вращения
(df.pivot(index='selection_id', columns=last_traded_price', values='last_traded_price')
Сводная таблица не работает из-за повторяющихся строк в selection_id.
можно ли сначала перенести данные, а затем удалить дубликаты?
Ответ №1:
Вариант 1
groupby
apply
v = df.groupby('selection_id').last_traded_price.apply(list)
pd.DataFrame(v.tolist(), index=v.index)
0 1 2 3
selection_id
430494 1.46 1.48 1.56 1.57
430495 2.45 2.67 2.72 2.87
Вариант 2
Вы можете сделать это с pivot
помощью , если у вас есть еще один столбец подсчетов, который нужно передать для поворота (его нужно повернуть вдоль чего-то, вот почему).
df['Count'] = df.groupby('selection_id').cumcount()
df.pivot('selection_id', 'Count', 'last_traded_price')
Count 0 1 2 3
selection_id
430494 1.46 1.48 1.56 1.57
430495 2.45 2.67 2.72 2.87
Комментарии:
1. Теперь все в порядке, только вы можете изменить
pd.Series.tolist
наlist
для лучшего ответа 😉2. @jezrael Большое вам спасибо, это именно то, что я мог бы извлечь из этого пользу…
3. @jezrael спасибо, чувак, твой ответ решил мою проблему. Я бы оценил лучший ответ, но у меня недостаточно репутации, чтобы сделать это. Я сделаю это, когда сделаю!
4. @tomoc4 вы все еще можете принять его ответ. Вы также можете озвучить оба ответа, потому что я думаю, что они хороши.
5. @coldspeed Я попробовал запустить оба решения, и по какой-то причине мои результаты оказались не такими, как я ожидал. Возможно, я был недостаточно конкретен в первоначальном вопросе. по какой-то причине selection_id также печатается вдоль столбцов. Сначала мне нужно перенести last_traded_price, а затем после этого удалить строки, содержащие повторяющиеся идентификаторы selection_id. Я хотел бы также упомянуть, что я пробую это на 4 миллионах строк!
Ответ №2:
Вы можете использовать cumcount
счетчик для имен новых столбцов, созданных set_index
unstack
или pandas.pivot
:
g = df.groupby('selection_id').cumcount()
df = df.set_index(['selection_id',g])['last_traded_price'].unstack()
print (df)
0 1 2 3
selection_id
430494 1.46 1.48 1.56 1.57
430495 2.45 2.67 2.72 2.87
Аналогичное решение с pivot
:
df = pd.pivot(index=df['selection_id'],
columns=df.groupby('selection_id').cumcount(),
values=df['last_traded_price'])
print (df)
0 1 2 3
selection_id
430494 1.46 1.48 1.56 1.57
430495 2.45 2.67 2.72 2.87