用vlookup乘数据帧

2024-07-07 07:21:25 发布

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

我有一个非常大的数据框,有多年的销售数据和数以万计的歪斜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\u id映射到skew\u 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       
...

Tags: 数据内存iddate情况priceunitsskew
2条回答

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

或者如果你遇到记忆问题,你可以自己循环所有的日期。速度较慢,但可能需要较少的内存。你知道吗

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)

相关问题 更多 >