dai*_*yue 4 python dictionary dataframe python-3.x pandas
我有两个df-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
Run Code Online (Sandbox Code Playgroud)
我想左合并df_a有df_b,
df_a = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on=['number', 'code'])
Run Code Online (Sandbox Code Playgroud)
并且,deleted在合并结果中创建一个标记,该标记df_a具有三个可能的值-full,partial和none;
full-如果所有与特定number值关联的行都具有deletion= L;
partial-如果某些行与特定number值关联,则deletion= L;
none-没有与特定number值关联的行deletion= L;
同样,在进行合并时,不应考虑df_bwith deletion= L的行;所以结果看起来像
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
Run Code Online (Sandbox Code Playgroud)
我试过了,
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')
Run Code Online (Sandbox Code Playgroud)
但是我有一个错误
AttributeError: 'DataFrame' object has no attribute 'map'
Run Code Online (Sandbox Code Playgroud)
似乎df没有map功能,所以我想知道是否还有其他方法可以实现此目的。
pd.DataFrame对象没有map方法。您可以改为从两列构造一个索引并pd.Index.map与一个函数一起使用:
df_a['deleted'] = df_a.set_index(['number', 'code']).index.map(d.get)
df_a['deleted'] = df_a['deleted'].fillna('none')
Run Code Online (Sandbox Code Playgroud)
请注意,我们使用d.get而不是d这里。不同于pd.Series.map,pd.Index.map不能直接接受字典,但是可以接受诸如的功能dict.get。
还要注意,我们将fillna操作拆分为pd.Index.map返回数组而不是序列。