Транспонирование столбца в фрейме данных pandas при сохранении неповрежденности другого столбца с дубликатами

#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