使用Python Pandas根据价格和数量计算营收并添加至DataFrame
解决方案:按日期门店计算营收并追加到DataFrame
这问题我熟,咱们可以用Pandas的重塑+合并功能轻松搞定,下面是具体步骤和代码:
1. 先构造示例数据(方便你测试)
首先先把你给出的DataFrame用代码复现出来:
import pandas as pd data = { 'date': ['2013-06-20', '2013-06-20', '2013-06-21', '2013-06-21', '2013-06-20', '2013-06-20', '2013-06-21', '2013-06-21'], 'store': [1, 2, 1, 2, 1, 2, 1, 2], 'property_name': ['price', 'price', 'price', 'price', 'quantity', 'quantity', 'quantity', 'quantity'], 'property_value': [101, 201, 301, 401, 1000, 2000, 3000, 4000] } df = pd.DataFrame(data)
2. 方法一:先转宽格式计算,再转回长格式合并
这种方法逻辑清晰,适合数据规整的场景:
# 第一步:把长格式数据转成宽格式,让同一日期+门店的price和quantity在同一行 wide_df = df.pivot(index=['date', 'store'], columns='property_name', values='property_value').reset_index() # 第二步:计算营收(price * quantity) wide_df['revenue'] = wide_df['price'] * wide_df['quantity'] # 第三步:把营收数据转回长格式,匹配原DataFrame的结构 revenue_df = wide_df.melt( id_vars=['date', 'store'], value_vars=['revenue'], var_name='property_name', value_name='property_value' ) # 第四步:合并原数据和营收数据,重置索引 final_df = pd.concat([df, revenue_df], ignore_index=True)
运行后final_df的结果就是你要的:
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 8 2013-06-20 1 revenue 101000 9 2013-06-20 2 revenue 402000 10 2013-06-21 1 revenue 903000 11 2013-06-21 2 revenue 1604000
3. 方法二:直接用GroupBy计算
如果不想转格式,也可以直接按date和store分组,每组内取出price和quantity的值相乘:
# 按日期和门店分组,计算每组的营收 revenue_df = df.groupby(['date', 'store']).apply( lambda x: pd.Series({ 'property_name': 'revenue', 'property_value': x[x['property_name'] == 'price']['property_value'].iloc[0] * x[x['property_name'] == 'quantity']['property_value'].iloc[0] }) ).reset_index() # 合并数据 final_df = pd.concat([df, revenue_df], ignore_index=True)
这种方法不需要做格式转换,适合你不确定数据是否有其他属性的场景,但要确保每组里price和quantity各有且仅有一条数据。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

