减去与其他数据帧中的索引匹配的值

2024-10-04 03:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这有点基本,但我找不到简单的答案。在Python中,有一个数据帧a,如下所示:

  ItemId      Price
  -------   -------
0   a1         10.0
1   a1         15.0
2   a2          8.0
3   a3          7.0

第二个是B,如下所示,其中项目ID只出现一次,它们是索引:

ItemId   Discount
------  ---------
a1            0.2
a2            0.5
a4            0.3

我想通过匹配项目ID,从dataframeA的“价格”中减去“折扣”值(从B),如下所示:

ItemId   Price
-------  -----
a1         9.8
a1        14.8
a2         7.5
a3         7.0

考虑到实际的数据帧有数千行和许多其他列,我如何以有效的方式做到这一点


Tags: 数据项目答案ida2a1方式价格
3条回答

您可以使用merge对齐“ItemId”列上的帧,并使用eval对这些对齐的列进行操作:

>>> df1.merge(df2, on="ItemId", how="left").eval("Price - Discount.fillna(0)")
0     9.8
1    14.8
2     7.5
dtype: float64

您可以使用map

>>> dfA["Price"]-dfA["ItemId"].map(dfB["Discount"])
0     9.8
1    14.8
2     7.5
dtype: float64

^{}使用价格df和fill_value=0的折扣:

A.set_index('ItemId').Price - B.Discount.reindex(A.ItemId, fill_value=0)

# ItemId
# a1     9.8
# a1    14.8
# a2     7.5
# a3     7.0
# dtype: float64

当前答案的时间安排:

timings of map vs reindex vs merge

map_ = lambda A, B: A.Price - A.ItemId.map(B.Discount).fillna(0)
reindex_ = lambda A, B: A.set_index('ItemId').Price - B.Discount.reindex(A.ItemId, fill_value=0)
merge_ = lambda A, B: A.merge(B, on='ItemId', how='left').eval('Price - Discount.fillna(0)')

相关问题 更多 >