Je voudrais multiplier deux dataframes df1 et df2, en fonction d'une condition et de manière efficace.
df1:
df1 = pd.DataFrame(columns=['user_id', 'gender', 'value_1', 'value_2', 'value_3'], data = [[112,0,50,60,70], [73,10,20,40,55],[61, 0, 15, 30, 45]])
user_id gender value_1 value_2 value_3
0 112 0 50 60 70
1 73 10 20 40 55
2 61 0 15 30 45
df2:
df2 = pd.DataFrame(columns=['gender', 'value_1', 'value_2', 'value_3'], data = [[2, 3, 5, 0], [4, 6, 7, 10]])
value_1 value_2 value_3 gender
0 2 3 5 0
1 4 6 7 10
Je voudrais multiplier les colonnes value_1, value_2, value_3 de df1 par df2 où la colonne gender correspond dans les deux dataframes. J'ai fait cela de la manière suivante et cela fonctionne bien:
val_cols = ['value_1', 'value_2', 'value_3']
df1.loc[df1.gender==0, val_cols] *= df2[df2.gender==0][val_cols].values[0].tolist()
df1.loc[df1.gender==10, val_cols] *= df2[df2.gender==10][val_cols].values[0].tolist()
Mais cela n'est applicable que si la colonne de genre n'a que quelques valeurs, dans ce cas, elle ne peut être que de 0 et 10. Mais que se passerait-il s'il y avait des valeurs plus distinctes pour le genre? Y a-t-il une meilleure façon de le faire au cas où les valeurs de genre et, par conséquent, le nombre d'enregistrements dans le df2 sont plus élevés? PS: Mes vraies dataframes sont très grandes, donc je ne peux pas utiliser les fonctions apply ou map.
Vous pouvez .set_index()
à gender
des deux dataframes puis faire df.mul()
:
df1 = pd.DataFrame(columns=['user_id', 'gender', 'value_1', 'value_2', 'value_3'], data = [[112,0,50,60,70], [73,10,20,40,55],[61, 0, 15, 30, 45]])
df2 = pd.DataFrame(columns=['value_1', 'value_2', 'value_3', 'gender'], data = [[2, 3, 5, 0], [4, 6, 7, 10]])
df1 = df1.set_index(['gender', 'user_id'])
df2 = df2.set_index('gender')
out = df1.mul(df2, level=0)
print(out)
Impressions:
value_1 value_2 value_3
gender user_id
0 112 100 180 350
10 73 80 240 385
0 61 30 90 225
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras