我有两只熊猫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