基于条件替换Pandas数据框中的值

3

我有一个主数据框,名为df:

Colour Item   Price
Blue   Car     40
Red   Car     30
Green  Truck   50
Green  Bike    30

接下来我有一个价格修正数据框,df_pc:

Colour Item   Price
Red   Car     60
Green  Bike    70

如果在价格校正数据框中找到了颜色和物品匹配的内容,则用该数据框中的价格替换主数据框中的价格。因此,期望的输出结果为:

Colour Item   Price
Blue   Car     60
Red   Car     30
Green  Truck   50
Green  Bike    70

目前我找不到实现这个的方法。


1
首先,考虑如果有多个匹配项应该发生什么。假设没有,您可以在关键字颜色/项目上合并两个数据框,然后使用第一个数据框中的值填充合并数据框列中的空白。如果您需要确切的代码帮助,请发布生成数据框的工作代码示例。 - 576i
好的,谢谢。是的,不要重复。你认为这是最好的做法吗? - fred.schwartz
1
df.drop_duplicates(keep='first', subset=['Colour', 'Item']),其中包含对要执行的参数。 - 576i
2个回答

3

使用Index.isin来过滤不匹配的行,然后使用DataFrame.combine_first

df = df.set_index(['Colour','Item'])
df_pc = df_pc.set_index(['Colour','Item'])

df_pc = df_pc[df_pc.index.isin(df.index)]
df = df_pc.combine_first(df).reset_index()
print (df)
  Colour   Item  Price
0   Blue    Car   40.0
1  Green   Bike   70.0
2  Green  Truck   50.0
3    Red    Car   60.0

另一项数据测试:

print (df_pc)
   Colour  Item  Price
0     Red   Car     60
1  Orange  Bike     70 <- not matched row

df = df.set_index(['Colour','Item'])
df_pc = df_pc.set_index(['Colour','Item'])
df_pc = df_pc[df_pc.index.isin(df.index)]
df = df_pc.combine_first(df).reset_index()
print (df)
  Colour   Item  Price
0   Blue    Car   40.0
1  Green   Bike   30.0
2  Green  Truck   50.0
3    Red    Car   60.0

谢谢@jezrael。这很棒。我可以确认一下,如果df_pc中有一行是不必要的,那么它会被忽略(并且不会以任何方式添加到主数据框中)吗? - fred.schwartz
1
啊,我明白了,这就是你的编辑所做的。非常感谢。 - fred.schwartz

2

这里有一种使用combine_first()的方法:

df_pc.set_index(['Colour','Item']).combine_first(
       df.set_index(['Colour','Item'])).reset_index()

  Colour   Item  Price
0   Blue    Car   40.0
1  Green   Bike   70.0
2  Green  Truck   50.0
3    Red    Car   60.0

编辑: 如果您只想要匹配的项目,我们还可以使用merge与fillna:

print(df_pc)

  Colour  Item  Price
0     Red   Car     60
1  Orange  Bike     70 #changed row not matching

(df.merge(df_pc, on = ['Colour','Item'],how='left',suffixes=('_x',''))
   .assign(Price=lambda x:x['Price'].fillna(x['Price_x'])).reindex(df.columns,axis=1))

  Colour   Item  Price
0   Blue    Car   40.0
1    Red    Car   60.0
2  Green  Truck   50.0
3  Green   Bike   30.0

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