Python 熊猫将一列的条目除以另一数据帧的条目
我有两个数据框-A和B。A包含各个商店、部门的每周销售数据,这些数据由一个键Python 熊猫将一列的条目除以另一数据帧的条目,python,pandas,Python,Pandas,我有两个数据框-A和B。A包含各个商店、部门的每周销售数据,这些数据由一个键商店/部门日期(例如2\u 12\u 2010-04-03)索引,而B包含给定商店的相应消费者价格指数(CPI)和日期,例如2\u 2010-04-03 > A.columns > Out [ ] : Index([u'Store', u'Dept', u'Date', u'Weekly_Sales'], dtype='object') > B.columns > Out [ ] : I
商店/部门日期
(例如2\u 12\u 2010-04-03
)索引,而B包含给定商店的相应消费者价格指数(CPI)和日期,例如2\u 2010-04-03
> A.columns
> Out [ ] : Index([u'Store', u'Dept', u'Date', u'Weekly_Sales'], dtype='object')
> B.columns
> Out [ ] : Index([u'Store', u'Date', u'CPI'], dtype='object')
我想通过将A中的每一行除以B中给出的相应CPI值来规范化A中给出的每周销售额
目前我正在尝试:
for ix,row in A.iterrows():
f_index = str(row['Store']) + "_" + row['Date']
A.ix[ix,'Weekly_Sales'] = row['Weekly_Sales']/ B.ix[f_index,'CPI']
A包含421570行。我的程序需要很长时间才能运行。正确有效的方法是什么 DataFrames'merge方法应该更快,即使它复制数据。您可以设置标志
copy=False
,以最小化不必要的复制
如果B中的每个日期对应A中的一个日期,则您可以执行以下操作:
C = A.merge(B, on=['Store', 'Date'], copy=False)
C['Normalized_Sales'] = C.Weekly_Sales / C.CPI
A.set_索引(['Store',Date'])['Weekly_Sales']/B.set_索引(['Store',Date'])['CPI']
。如果始终对A
或B
进行索引,则此方法效果最佳,因为索引也将有助于其他操作。如问题所述,数据帧A和B已在不同的键上进行索引。为什么我的程序这么慢?@slushy给出的解决方案效果很好。