我有一个非常大的数据框,其中包含多年的销售数据和成千上万的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
...
答案 0 :(得分: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()
答案 1 :(得分:0)
您可以通过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)