【问题标题】:Multiply pandas dataframe by vlookup通过 vlookup 乘以 pandas 数据帧
【发布时间】:2020-03-18 14:15:38
【问题描述】:

我有一个非常大的数据框,其中包含多年的销售数据和数万个 skew_id(即):

     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
...

我有另一个将 skew_ids 映射到 skew_price(即)的数据框:

  skew_id  skew_price
0   123       100.00
1   456       10.00
...

我的第一个数据帧太大了,我无法在不达到内存限制的情况下合并。

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

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

【问题讨论】:

  • 我建议你将大的df 分割成更小的部分,然后将它们一个一个地合并(当然是在一个循环中)。
  • 预期输出是什么?
  • 已编辑以包含预期输出

标签: python pandas


【解决方案1】:

我认为这取决于行数、唯一 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()

【讨论】:

  • 内存消耗比merge少吗?
  • @Aryerez - 我认为是的
  • 我希望 OP 能在完成这项工作后发表评论。我自己有一天可能会使用它。
  • 如何将多列作为映射目标?说 df1['id2'] = ['a', 'a', 'b', 'b', 'a'] 和 df2 对于 skew_id 和 id2 的每个组合会有两个额外的行?还是我应该将其作为一个单独的问题发布? This question 接近了
【解决方案2】:

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

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

或者,如果您遇到内存问题,您可以自己循环遍历所有日期。这速度较慢,但​​可能需要更少的内存。

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)

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2017-03-08
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多