我有两个数据框 - df_a 和 df_b,
# df_a
number cur code
1000 USD 700
2000 USD 800
3000 USD 900
# df_b
number amount deletion code
1000 0.0 L 700
1000 10.0 X 700
1000 10.0 X 700
2000 20.0 X 800
2000 20.0 X 800
3000 0.0 L 900
3000 0.0 L 900
我希望将df_a
与df_b
进行左连接合并。
df_a = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on=['number', 'code'])
并且,在合并结果df_a中创建一个名为“deleted”的标志,它有三个可能的值-完整、部分和无;
“full” - 如果与特定“number”值相关联的所有行都具有“deletion”= L;
“partial” - 如果与特定“number”值相关联的某些行具有“deletion”= L;
“none” - 没有与特定“number”值相关联的行具有“deletion”= L;
此外,在进行合并时,不应考虑具有“deletion”= L的df_b中的行; 因此结果看起来像这样:
number amount deletion deleted cur code
1000 10.0 X partial USD 700
1000 10.0 X partial USD 700
2000 20.0 X none USD 800
2000 20.0 X none USD 800
3000 0.0 NaN full USD 900
我尝试过,
g = df_b['deletion'].ne('L').groupby([df_b['number'], df_b['code']])
m1 = g.any()
m2 = g.all()
d1 = dict.fromkeys(m1.index[m1 & ~m2], 'partial')
d2 = dict.fromkeys(m2.index[m2], 'full')
d = {**d1, **d2}
df_a = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on=['code', 'number'])
df_a['deleted'] = df_a[['number', 'code']].map(d).fillna('none')
但是我遇到了一个错误。
AttributeError: 'DataFrame' object has no attribute 'map'
看起来 df
没有 map
函数,所以我想知道是否有其他替代的方法可以实现这个功能。
df_a[['number', 'code']].map(d).fillna('none')
来赋值df_a['deleted']
,结果出错了。请问有其他方法能够实现同样的效果吗? - daiyue