J'ai un dataframe:
df = pd.DataFrame({'date': ['2013-04-01','2013-04-02','2013-04-03','2013-04-04', '2013-04-05'],
'month': ['1','1','3','3','5'],
'value': ['1', '1', '2', '5', '5'],
})
Je dois diviser duration et pduration par la colonne de valeur de la deuxième dataframe où date et mois sur deux correspondances df . Le deuxième df est:
df = pd.DataFrame({'date': ['2013-04-01','2013-04-01','2013-04-01','2013-04-02', '2013-04-02'],
'month': ['1','1','3','3','5'],
'pmonth': ['1', '1', '2', '5', '5'],
'duration': [30, 15, 20, 15, 30],
'pduration': ['10', '20', '30', '40', '50']})
Le deuxième df est groupé par date et mois, donc une combinaison en double de date mois ne sera pas présent dans le deuxième df.
3 Réponses :
Vous pouvez fusionner le deuxième df dans le premier df, puis le diviser.
Considérez le premier df comme df1 et le deuxième df comme df2
vous pouvez fusionner les deux dataframes, où la date et le mois correspondent à la colonne de valeur seront ajoutés au premier bloc de données. S'il n'y a pas de correspondance, il sera représenté par NaN. Vous pouvez ensuite effectuer une opération de division. voir le code ci-dessous
En supposant que votre deuxième dataframe est df2, alors
date month value pmonth duration pduration newduration newpduration 0 2013-04-01 1 1 1 30 10 30.0 10.0 1 2013-04-01 1 1 1 15 20 15.0 20.0 2 2013-04-01 3 NaN 2 20 30 NaN NaN 3 2013-04-02 3 NaN 5 15 40 NaN NaN 4 2013-04-02 5 NaN 5 30 50 NaN NaN
aboutit à
df3 = df2.merge(df, how = 'right')
for col in ['duration','pduration']:
df3['new_'+col] = df3[col].astype(float)/df3['value'].astype(float)
df3
Tout d'abord, vérifiez si les mêmes dtypes de la colonne date et month dans les deux DataFrames et si numérique pour colonnes pour diviser:
df[['duration_new','pduration_new']] = (df[['duration','pduration']]
.div(df.pop('value'), axis=0))
print (df)
date month pmonth duration pduration duration_new pduration_new
0 2013-04-01 1 1 30 10 30.0 10.0
1 2013-04-01 1 1 15 20 15.0 20.0
2 2013-04-01 3 2 20 30 NaN NaN
3 2013-04-02 3 5 15 40 NaN NaN
4 2013-04-02 5 5 30 50 NaN NaN
Puis fusionner avec la jointure gauche et diviser par DataFrame.div
df = df1.merge(df2, on=['date', 'month'], how='left')
df[['duration_new','pduration_new']] = df[['duration','pduration']].div(df['value'], axis=0)
print (df)
date month pmonth duration pduration value duration_new \
0 2013-04-01 1 1 30 10 1.0 30.0
1 2013-04-01 1 1 15 20 1.0 15.0
2 2013-04-01 3 2 20 30 NaN NaN
3 2013-04-02 3 5 15 40 NaN NaN
4 2013-04-02 5 5 30 50 NaN NaN
pduration_new
0 10.0
1 20.0
2 NaN
3 NaN
4 NaN
Pour supprimer value utilise pop :
#convert to numeric df1['pduration'] = df1['pduration'].astype(int) df2['value'] = df2['value'].astype(int) print (df1.dtypes) date object month object pmonth object duration int64 pduration int32 print (df2.dtypes) date object month object value int32 dtype: object
Et quel est votre résultat attendu?
@coldspeed Je veux diviser toutes les valeurs de durée et de pduration par la colonne de valeur du deuxième df si la date et le mois correspondent, donc dans ce cas, la durée et la durée des deux premières lignes doivent être divisées par 1 car la colonne de valeur du deuxième df a une valeur 1 pour la date du 01/04/2013 et 1 mois et ainsi de suite.