2 votes

Fusionner les colonnes pandas dfs si les valeurs se chevauchent, sinon assigner la valeur par défaut

J'ai deux pandas dfs

df1

val dat
1   0
2   0
3   100
4   100
5   50
6   4

df2

val
3
5

Je souhaite créer une nouvelle colonne df1[both], dont les valeurs se chevauchent entre df1[val] et df2[val] et les valeurs qui ne se chevauchent pas se voient attribuer une valeur par défaut = 0.

val dat both
1   0   0
2   0   0
3   100 3
4   100 0
5   50  5
6   4   0

Comment faire ? Merci de votre réponse.

1voto

jezrael Points 290608

Utilisation DataFrame.merge avec jointure à gauche et nouvelle colonne both por DataFrame.assign puis remplacer les valeurs manquantes :

df1 = df1.merge(df2.assign(both = df2['val']), how='left').fillna({'both':0})
print (df1)
   val  dat  both
0    1    0   0.0
1    2    0   0.0
2    3  100   3.0
3    4  100   0.0
4    5   50   5.0
5    6    4   0.0

Ou si vous avez besoin de nombres entiers, utilisez :

df1 = df1.merge(df2.assign(both = df2['val']), how='left').fillna({'both':0})
df1['both'] = df1['both'].astype(int)
print (df1)
   val  dat  both
0    1    0     0
1    2    0     0
2    3  100     3
3    4  100     0
4    5   50     5
5    6    4     0

1voto

yatu Points 39897

Une solution pourrait consister à merge les deux cadres de données, et utiliser le résultat de la fonction indicator colonne à map à l'une ou l'autre 0 ou la valeur val :

df = df1.merge(df2, how='left',on='val', indicator='both')
df['both'] = df.both.eq('both').mul(df.val)

print(df)
   val  dat  both
0    1    0     0
1    2    0     0
2    3  100     3
3    4  100     0
4    5   50     5
5    6    4     0

1voto

Henry Yik Points 9160

Vous pouvez utiliser pd.Series.where :

df["both"] = df["val"].where(df["val"].isin(df2["val"]), 0)

print (df)

   val  dat  both
0    1    0     0
1    2    0     0
2    3  100     3
3    4  100     0
4    5   50     5
5    6    4     0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X