pandas的“DataFrame”对象没有“map”属性。

4

我有两个数据框 - 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_adf_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 函数,所以我想知道是否有其他替代的方法可以实现这个功能。


1
@jpp 抱歉,我再次更新了代码。之前我尝试使用 df_a[['number', 'code']].map(d).fillna('none') 来赋值 df_a['deleted'],结果出错了。请问有其他方法能够实现同样的效果吗? - daiyue
这个回答解决了你的问题吗?AttributeError:'DataFrame'对象没有'map'属性' - AMC
1个回答

7

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')

兼容性说明

对于Pandas版本大于0.25的情况,您可以直接使用带有字典的pd.Index.map函数,即使用d代替d.get

对于早期版本,我们使用d.get而不是d,因为与pd.Series.map不同,pd.Index.map无法直接接受一个字典。但它能够接受像dict.get这样的函数。请注意,我们将fillna操作分开了,因为pd.Index.map返回的是一个数组而不是一个系列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接