如果值重叠,则合并pandas-dfs列,否则指定默认值



我有两只熊猫dfs

df1

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

df2

val
3
5

我想创建一个新的列df1[both],其中的值在df1[val]和df2[val]之间重叠,并且为不重叠的值分配默认值=0

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

我该怎么做?谢谢

使用带有左联接的DataFrame.merge和带有DataFrame.assign的新列both,然后替换缺失的值:

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

或者,如果需要整数,请使用:

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

一种方法可以是merge两个数据帧,并使用从indicator列到map的结果到0或值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

您可以使用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

最新更新