python - pandas 'DataFrame' 对象没有属性 'map'
问题描述
我有两个 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
我想离开df_a
合并df_b
,
df_a = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on=['number', 'code'])
并且,创建一个deleted
在合并结果中调用的标志df_a
,它具有三个可能的值——完整、部分和无;
full
- 如果所有行都与一个特定number
值相关联,则有deletion
= L;
partial
- 如果某些行与特定number
值相关联,则有deletion
= L;
none
- 没有与特定number
值关联的行,有deletion
= L;
此外,在进行合并时,不应考虑来自df_b
with = L 的行;deletion
所以结果看起来像,
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
功能,所以我想知道是否有任何替代方法可以实现这一点。
解决方案
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')
兼容性说明
对于大于 0.25 的 Pandas 版本,您可以pd.Index.map
直接使用字典,即使用d
而不是d.get
.
对于以前的版本,我们使用d.get
而不是,d
因为不像pd.Series.map
,pd.Index.map
不直接接受字典。但它可以接受诸如dict.get
. 另请注意,我们将操作拆分fillna
为pd.Index.map
返回数组而不是系列。
推荐阅读
- spring - 在 Java Spring Boot 中实现工作流引擎
- python - 你如何迭代行索引并从python中的数据集中找到具有最大行列式的组?
- flutter - 如何将横幅广告的位置设置在右上角
- node.js - 回送/快速标记项目以在一段时间后删除
- scala - 为什么在 spark aggregateByKey 中从未调用组合器?
- reactjs - 在箭头函数内调用箭头函数。反应原生
- postgresql - Postgresql如何根据主选择中的值在选择中进行子选择
- assembly - 通过 DOS 或 BIOS 调用将控制台设置为 50 行模式?
- javascript - 我有我的背景改变颜色。我现在如何更改文本的颜色?
- java - 运行logback源码示例,IDEA提示找不到类GafferConfigurator