将一个数据帧中的匹配值替换为另一个数据帧中的索引值
Posted
技术标签:
【中文标题】将一个数据帧中的匹配值替换为另一个数据帧中的索引值【英文标题】:Replace matching values from one dataframe with index value from another dataframe 【发布时间】:2021-08-02 21:08:30 【问题描述】:我想用 df2['id'] 中的相应 ID 替换 df1['fruit'] 中的水果字符串。本质上,我正在尝试为水果创建一个查找表。
df1
fruit | store | price |
---|---|---|
apple | heb | 0.99 |
orange | heb | 0.69 |
apple | kroger | 0.88 |
apple | walmart | 0.89 |
banana | heb | 0.59 |
banana | walmart | 0.59 |
orange | kroger | 0.39 |
df2
id | fruit |
---|---|
0 | apple |
1 | orange |
2 | banana |
我想将 df1 修改为如下所示(最好是原地):
df1
fruit | store | price |
---|---|---|
0 | heb | 0.99 |
1 | heb | 0.69 |
0 | kroger | 0.88 |
0 | walmart | 0.89 |
2 | heb | 0.59 |
2 | walmart | 0.59 |
1 | kroger | 0.39 |
这似乎是一件很简单的事情,但我对 Pandas 还很陌生,所以我需要一些帮助。我所做的所有谷歌搜索和***-ing 还没有完全回答这个问题。另外,最终我还想创建一个查找数据框来对 df1['store']
中的商店名称字符串进行相同类型的替换以下是我迄今为止尝试过的一些事情:
.loc
df1.loc[df1['fruit'] == df2['fruit'], 'fruit'] = df2['id']
这会导致以下错误:ValueError: Can only compare identically-labeled Series objects
.哪里
df1.where(df1['fruit'] == df2['fruit'], other= df2['id'], inplace=True)
我知道我错了,因为where
应该根据错误条件替换值。另外,它不起作用,所以还有另一个线索我走错了路:)
.replace
我不再有此代码,但我尝试将 df2 转换为 dict 并有条件地替换 df1 中的值。
我知道我很接近了!这是我需要做的很多事情......根据来自另一个数据帧的值替换一个数据帧中的值。任何帮助将不胜感激!
提前致谢:)
【问题讨论】:
已经有很多关于这个的话题了。df2['fruit'].map(df1.set_index('fruit')['id'])
.
df1.merge(df2,on='fruit')
感谢@QuangHoang,但这会导致KeyError: 'id'
谢谢@AnuragDabas 这真的很接近我想要的,如果没有更好的方法我可以使用它。是否可以在不必删除 df1['fruit'] 并将新添加的 df1['id'] 列重命名为 'fruit' 的情况下进行这种操作?
顺便说一句,您不需要删除 df1['fruit'] 并将新添加的 df1['id'] 列重命名为 'fruit?...我的意思是您的意思..对不起我没听懂:(
【参考方案1】:
试一试:
df1['fruit'] = df1.fruit.map(dict(df2[['fruit','id']].values))
【讨论】:
我发现如果一行中的一个值等于 None,这个解决方案会将整个列的数据类型从 int 更改为 float。你知道为什么会这样吗? 因为 pandas 中的 NAN 不能通过 INT 表示。您可以使用 df[这可能不是最 Pythonic 的方式,而且肯定有 pandas 内置函数可以做到这一点(我鼓励你查看文档),但这里有一个可行的解决方案。
您可以通过创建映射函数并将其应用于您的列来实现。
映射功能:
从fd2
创建水果与其代码之间的对应字典
如果存在则返回关联值,否则返回原始值。
函数如下:
def mapping(x):
mapping_dict = df2.set_index("fruit")['id']
try:
return mapping_dict[x]
except:
return x #or whatever to indicate that the fruit is not in df2
将其应用于 df1:
df1['fruit'] = df1['fruit'].apply(mapping)
【讨论】:
以上是关于将一个数据帧中的匹配值替换为另一个数据帧中的索引值的主要内容,如果未能解决你的问题,请参考以下文章
如何用python中其他数据帧中的条目替换一个数据帧中列的丢失条目?
如何使用实际数据帧中两列中的值索引另一个数据帧,从而在实际数据框中创建列
CSV 文件中的任何“null”字符串都应替换为 pyspark 数据帧中的 SQL 值 null - Databricks