Строки в столбцах Python Pandas dataframe (pd.melt)

1

У меня есть dataframe, df, содержащий транзакции по карте. Одна карта может иметь несколько транзакций и, следовательно, несколько строк. Я хочу создать новую фреймворк с одной строкой на карту. Проблема заключается в том, что количество транзакций на карту может варьироваться. Я был в предположении, что pd.melt может решить эту проблему.

dataframe выглядит следующим образом:

CardCode    Coupon  ShopName    TranDate
1028670151  S       ShopA       2018-05-24 21:02:19.000
1028670151  S       ShopB       2018-05-23 13:14:44.000
1028670151  G       ShopC       2018-05-24 12:31:24.000
1029282454  S       ShopA       2018-05-19 19:52:40.000
1029282454  G       ShopB       2018-05-19 14:08:02.000
1029646050  S       ShopD       2018-06-17 14:10:42.000
1029684151  S       ShopE       2018-05-05 12:33:21.000
1029684151  G       ShopB       2018-05-05 15:13:08.000
1029684151  S       ShopC       2018-05-06 14:21:02.000
1029754252  G       ShopA       2018-05-05 10:40:30.000

Код, который я пробовал:

df_new = pd.melt(df, 
                 id_vars = ['CardCode   '], 
                 value_vars = ['TranDate', 'Coupon', 'ShopName'])

Хотя это и приводит меня к моей цели, у меня нет одной строки на CardCode, и это мое окончательное намерение здесь.

Желаемый результат выглядит следующим образом:

1028670151  S       ShopA       2018-05-24 21:02:19.000 S       ShopB       2018-05-23 13:14:44.000 G       ShopC       2018-05-24 12:31:24.000

Какие-либо предложения?

Большое спасибо!

  • 1
    Как бы вы CardCode строку для CardCode "1028670151"? Структура, которая у вас сейчас есть, имеет смысл - я не уверен, что вам действительно нужен один ряд на карту. У меня есть ощущение, что это может быть проблема XY, и это может помочь, если вы описали, почему вы хотите это / что вы хотите делать с этими данными, а что-то еще может быть тем, что вам действительно нужно ...
  • 0
    @Jon спасибо за ваш вклад, я добавил желаемый результат.
Показать ещё 4 комментария
Теги:
pandas

1 ответ

0
Лучший ответ

Хорошо, вы можете использовать cumcount и unstack:

df_out = df.set_index(['CardCode',df.groupby('CardCode').cumcount() + 1])\
           .unstack()\
           .sort_index(level=1, axis=1)

df_out.columns = [f'{i}_{j}' for i,j in df_out.columns]

df_out = df_out.reset_index()

df_out

Выход:

     CardCode Coupon_1 ShopName_1               TranDate_1 Coupon_2 ShopName_2               TranDate_2 Coupon_3 ShopName_3               TranDate_3
0  1028670151        S      ShopA  2018-05-24 21:02:19.000        S      ShopB  2018-05-23 13:14:44.000        G      ShopC  2018-05-24 12:31:24.000
1  1029282454        S      ShopA  2018-05-19 19:52:40.000        G      ShopB  2018-05-19 14:08:02.000      NaN        NaN                      NaN
2  1029646050        S      ShopD  2018-06-17 14:10:42.000      NaN        NaN                      NaN      NaN        NaN                      NaN
3  1029684151        S      ShopE  2018-05-05 12:33:21.000        G      ShopB  2018-05-05 15:13:08.000        S      ShopC  2018-05-06 14:21:02.000
4  1029754252        G      ShopA  2018-05-05 10:40:30.000      NaN        NaN                      NaN      NaN        NaN                      NaN
  • 0
    Спасибо Скотт, синтаксис немного сложен для меня, но это работает, отлично!
  • 0
    @SQL_M Хорошо, запустите df.groupby('CardCode').cumcount() + 1 это даст вам текущий счетчик отдельных CardCode. Затем мы используем set_index для добавления CardCode и счетчика. Затем мы снимаем счетчик, чтобы поместить его в заголовки столбцов, это создает заголовок столбца MultiIndex. Затем сортируйте заголовок столбца MultiIndex по уровню подсчета, чтобы собрать все 1, а затем 2 и т. Д. Следующий оператор выравнивает заголовок столбца с несколькими индексами в заголовок столбца одного уровня, используя понимание списка.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню