【问题标题】:Python pandas: calculate revenue from price and quantityPython pandas:从价格和数量计算收入
【发布时间】:2018-03-23 06:35:29
【问题描述】:

我有一个如下所示的数据框:

df
Out[327]: 
        date  store property_name  property_value
0 2013-06-20      1         price             101
1 2013-06-20      2         price             201
2 2013-06-21      1         price             301
3 2013-06-21      2         price             401
4 2013-06-20      1      quantity            1000
5 2013-06-20      2      quantity            2000
6 2013-06-21      1      quantity            3000
7 2013-06-21      2      quantity            4000

我想计算每个日期、每个商店的收入,然后将其添加到数据框的底部。例如,对于 2014 年 6 月 20 日,对于商店#2:收入=201*2000 = 402000。

以下是我的代码,但我知道它对于较大的数据帧效率不高:

import pandas  as pd

dates = df['date'].unique()
stores = df['store'].unique()
df_len = len(df)
for date in dates:
    for store in stores:       
        mask_price = (df['date']==date) & (df['store']==store) & (df['property_name']=='price')
        mask_quantity = (df['date']==date) & (df['store']==store) & (df['property_name']=='quantity')
        price = df.loc[mask_price,'property_value'].iloc[0]
        quantity = df.loc[mask_quantity,'property_value'].iloc[0]

        df.loc[df_len,'date'] = date
        df.loc[df_len,'store'] = store
        df.loc[df_len,'property_name'] = 'revenue'
        df.loc[df_len,'property_value'] = price*quantity

        df_len=df_len+1

非常感谢您的帮助:)

【问题讨论】:

  • “帮助”意味着协作。你到底有什么尝试?
  • 嗨,roganjosh,我刚刚尝试了一个 For 循环,我知道这不是很有效,因为我是 Pandas 的新手。我知道有更好的方法来做到这一点。
  • 所以请展示你的低效方式,甚至是一个失败的pandas尝试。到目前为止,我看到您提出的三个问题只是举手自己做,并要求 SO 为您做。你不能那样学习pandas
  • 我刚刚添加了代码。

标签: python pandas vectorization pandas-groupby


【解决方案1】:

这是一种方式。

price = df[df['property_name'] == 'price'].set_index(['date', 'store'])['property_value']
quantity = df[df['property_name'] == 'quantity'].set_index(['date', 'store'])['property_value']

rev = (price * quantity).reset_index().assign(property_name='revenue')

df = pd.concat([df, rev], ignore_index=True)

说明

  • 通过切片导出pricequantity 数据帧,按datestore 索引。
  • 通过索引上的price * quantity 计算rev;添加property_name 列。
  • 默认情况下沿axis=0 连接(索引)。

结果

          date property_name  property_value  store
0   2013-06-20         price             101      1
1   2013-06-20         price             201      2
2   2013-06-21         price             301      1
3   2013-06-21         price             401      2
4   2013-06-20      quantity            1000      1
5   2013-06-20      quantity            2000      2
6   2013-06-21      quantity            3000      1
7   2013-06-21      quantity            4000      2
8   2013-06-20       revenue          101000      1
9   2013-06-20       revenue          402000      2
10  2013-06-21       revenue          903000      1
11  2013-06-21       revenue         1604000      2

【讨论】:

    【解决方案2】:

    另一种方法:

    prices = df[df['property_name'] == 'price']
    quantities = df[df['property_name'] == 'quantity']
    
    res = prices.merge(quantities,on=['date','store'],how='left')
    res['property_value'] = res['property_value_x']*res['property_value_y']
    res['property_name'] = 'revenue'
    res = res[['date','store','property_name','property_value']]
    
    res = prices.append([quantities,res])
    

    与这里的第一个答案相同的逻辑:

    1. 单独的价格和数量
    2. 使用 datestore 作为键合并两个表
    3. 计算第三个表中的所需列
    4. 连接所有内容

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2020-09-16
      • 2014-01-31
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多