繁体   English   中英

将 pandas dataframe 乘以 vlookup

[英]Multiply pandas dataframe by vlookup

我有一个非常大的 dataframe 有多年的销售数据和数万个 skew_ids(即):

     date      skew_id  units_sold
0 2001-01-01      123       1
1 2001-01-02      123       2
2 2001-01-03      123       3
3 2001-01-01      456       4
4 2001-01-02      456       5
...

我有另一个 dataframe 将 skew_ids 映射到 skew_price (即):

  skew_id  skew_price
0   123       100.00
1   456       10.00
...

我的第一个 dataframe 太大了,如果不达到 memory 限制,我就无法合并。

我想计算每日收入(即):

    date       revenue
0 2001-01-01      140      
1 2001-01-02      250       
2 2001-01-03      300       
...

我认为这取决于行数、唯一skew_id值的数量和RAM的大小。

map的一种可能解决方案:

df1['revenue'] = df1['skew_id'].map(df2.set_index('skew_id')['skew_price']) * df1['units_sold']

df2 = df1.groupby('date', as_index=False)['revenue'].sum()

您可以通过 groupby 实现此目的:

df.groupby('date').apply(lambda gr: df2.loc[df2.skew_id.isin(list(gr.skew_id))]['skew_price'].sum())

或者,如果您遇到 memory 问题,您可以自己遍历所有日期。 这较慢,但可能需要较少的 memory。

revenue = []
for d in df.date.unique():
    r = df2.loc[df2.skew_id.isin(list(df.loc[df.date == d].skew_id))]['skew_price'].sum()
    revenue.append({'date': d, 'revenue': r})
pd.DataFrame(revenue)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM