我想用 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 中的值。
我知道我很接近了!这是我需要做的很多事情......根据来自另一个数据帧的值替换一个数据帧中的值。任何帮助将不胜感激!
提前致谢:)
答案 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))