У меня есть 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
Какие-либо предложения?
Большое спасибо!
Хорошо, вы можете использовать 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
df.groupby('CardCode').cumcount() + 1
это даст вам текущий счетчик отдельных CardCode. Затем мы используем set_index для добавления CardCode и счетчика. Затем мы снимаем счетчик, чтобы поместить его в заголовки столбцов, это создает заголовок столбца MultiIndex. Затем сортируйте заголовок столбца MultiIndex по уровню подсчета, чтобы собрать все 1, а затем 2 и т. Д. Следующий оператор выравнивает заголовок столбца с несколькими индексами в заголовок столбца одного уровня, используя понимание списка.
CardCode
строку дляCardCode
"1028670151"? Структура, которая у вас сейчас есть, имеет смысл - я не уверен, что вам действительно нужен один ряд на карту. У меня есть ощущение, что это может быть проблема XY, и это может помочь, если вы описали, почему вы хотите это / что вы хотите делать с этими данными, а что-то еще может быть тем, что вам действительно нужно ...