用另一个数据帧的索引值替换一个数据帧的匹配值

时间:2021-05-12 13:33:39

标签: python pandas dataframe

我想用 df2['id'] 中的相应 ID 替换 df1['fruit'] 中的水果串。本质上,我正在尝试为水果创建一个查找表。

df1

<头>
水果 商店 价格
苹果 heb 0.99
橙色 heb 0.69
苹果 克罗格 0.88
苹果 沃尔玛 0.89
香蕉 heb 0.59
香蕉 沃尔玛 0.59
橙色 克罗格 0.39

df2

<头>
id 水果
0 苹果
1 橙色
2 香蕉

我想将 df1 修改成这样(最好就地):

df1

<头>
水果 商店 价格
0 heb 0.99
1 heb 0.69
0 克罗格 0.88
0 沃尔玛 0.89
2 heb 0.59
2 沃尔玛 0.59
1 克罗格 0.39

这似乎是一件很简单的事情,但我对 Pandas 还很陌生,所以我可以使用一些帮助。我所做的所有谷歌搜索和计算器溢出还没有完全回答这个问题。此外,最终我还想创建一个查找数据框来对 df1['store']

中的商店名称字符串进行相同类型的替换

以下是我迄今为止尝试过的一些方法:

.loc df1.loc[df1['fruit'] == df2['fruit'], 'fruit'] = df2['id']

这会导致以下错误:ValueError: Can only compare identically-labeled Series objects

.where

df1.where(df1['fruit'] == df2['fruit'], other= df2['id'], inplace=True)

我知道这一切都错了,因为 where 应该根据错误条件替换值。此外,它不起作用,所以还有另一个线索我走错了路:)

.replace

我没有此代码了,但我尝试将 df2 转换为 dict 并有条件地替换 df1 中的值。

我知道我很接近了!这是我需要做的很多事情......根据来自另一个数据帧的值替换一个数据帧中的值。任何帮助将不胜感激!

提前致谢:)

2 个答案:

答案 0 :(得分:1)

这可能不是最 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)

答案 1 :(得分:1)

尝试:

df1['fruit'] = df1.fruit.map(dict(df2[['fruit','id']].values))