Создайте разреженный фрейм данных из фрейма данных pandas со значениями списка

#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