#python #pandas #dataframe
Вопрос:
У меня есть рамка данных pandas с идентификаторами, датами и платежами, расположенными, как показано ниже. даты записываются в месяцах и соответствуют платежам с одним и тем же индексом в строке.
ID Dates payments
A ['02-2010','05-2010'] [45,50]
B ['02-2010','04-2010','06-2010'] [42,48,52]
C ['03-2010','04-2010','05-2010','06-2010'] [39,38,39,42]
Я хотел бы создать из этого разреженный кадр данных с идентификатором и датой в качестве моих измерений, заполняя ячейки 0, когда за этот месяц нет оплаты. результаты должны выглядеть так.
'02-2010' '03-2010' '04-2010' '05-2010' '06-2010'
A 45 0 0 50 0
B 42 0 48 0 52
C 0 39 38 39 42
Ответ №1:
Попробуй:
# transform dates, payments to python list
#from ast import literal_eval
#df["Dates"] = df["Dates"].apply(literal_eval)
#df["payments"] = df["payments"].apply(literal_eval)
df = df.explode(["Dates", "payments"])
print(df.pivot(index="ID", columns="Dates", values="payments").fillna(0))
С принтами:
Dates 02-2010 03-2010 04-2010 05-2010 06-2010
ID
A 45 0 0 50 0
B 42 0 48 0 52
C 0 39 38 39 42
Ответ №2:
Это сработало для меня.
#create dataframe
df_train = pd.DataFrame({ 'ID': ["A", "B","C"],
'Dates': [['02-2010','05-2010'] , ['02-2010','04-2010','06-2010'] , ['03-2010','04-2010','05-2010','06-2010']],
'payments': [[45,50],[42,48,52], [39,38,39,42]],
"m1":[45,58,74],
"m2":[4,8,7]
})
#explode and set ID as index
df=df.set_index(['ID']).apply(pd.Series.explode).reset_index()
#create pivot table
df =df.pivot(index="ID", columns="Dates", values="payments").fillna(0)
print(df)
С принтами:
Dates 02-2010 03-2010 04-2010 05-2010 06-2010
ID
A 45 0 0 50 0
B 42 0 48 0 52
C 0 39 38 39 42