2
votes

Diviser les colonnes dans df par une autre valeur df en fonction de la condition

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.


2 commentaires

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.


3 Réponses :


0
votes

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

< pré> XXX


0 commentaires

0
votes

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


0 commentaires

2
votes

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


0 commentaires