按收入总和和相应的最高贡献月份分组 - Pandas

问题描述 投票:0回答:4

我有一个账单详细信息数据集,我想根据产品的总价值对产品进行分组,另外我想要一列来指示相应产品产生最多收入的月份

数据集:

Bill_Id  Month  Product_Id  Net_Value
 1        1       20          100
 2        1       20          100
 3        2       20          100
 4        1       30          200
 5        2       30          200
 6        2       30          200

期望结果

Product_Id  Total_revenue  Top_Month
   20          300            1
   30          600            2

这只是一个样本数据集我有全年的交易数据

python pandas dataframe numpy
4个回答
4
投票

使用

aggfunc=sum
旋转数据框,然后沿列轴使用
sum
idxmax
查找总收入和对总收入贡献最高的月份,最后沿列轴
concat
各个组件获得结果

s = df.pivot_table('Net_Value', 'Product_Id', 'Month', aggfunc='sum')
pd.concat([s.sum(1), s.idxmax(1)], axis=1, keys=['Total_revenue', 'Top_Month'])

            Total_revenue  Top_Month
Product_Id                          
20                    300          1
30                    600          2

2
投票

假设根据 Net_Revenue 的最大总和,您只需要 1 个最高月份值,下面是可能适合您的代码。

我们可以通过以下三个阶段来实现这一目标:

1.根据产品id提取净收入总和
df_1 = df.groupby(['Product_Id']).agg({'Net_Value' : sum}).reset_index()
df_1 = df_1.rename(columns={'Net_Value' : 'Total_revenue'})

print(df_1)
Product_Id  Total_revenue
0   20  300
1   30  600
2.根据每个产品 ID 的最大总净收入提取最佳连续月份
df_2 = df.groupby(['Product_Id', 'Month']).agg({'Net_Value' : sum}).sort_values('Net_Value', ascending=False).reset_index()
df_2 = df_2.drop_duplicates(subset=['Product_Id'])[['Product_Id', 'Month']]

print(df_2)
Product_Id  Month
0   30  2
1   20  1
3.最后一步是根据产品 ID 将这两个数据帧合并为单个数据帧
final_df = df_1.merge(df_2)

print(final_df)
Product_Id  Total_revenue  Month
0          20            300      1
1          30            600      2

1
投票

对@Shubham 的方法进行小修改

result = (
    df.pivot_table("Net_Value", "Product_Id", "Month", aggfunc="sum")
    .agg(["sum", "idxmax"], axis=1)
    .set_axis(["Total_revenue", "Top_Month"], axis=1)
)

0
投票

由于多列正在交互,除了

apply
之外,我还使用了
groupby
函数:

Net_value 使用基本聚合函数计算

sum

Top_month 需要列之间的交互,因此,首先使用

idxmax
获取最大 Net_value 的索引,然后使用
loc
查找月份

生成的 Pandas Series 对象将 groupby 列 (Product_id) 作为索引,因此它使其成为我使用过的列

reset_index

def f(x):
    d = {}
    d['Net_Value'] = x['Net_Value'].sum()
    d['Top_month'] = df.loc[x['Net_Value'].idxmax(), "Month"]
    return pd.Series(d, index=['Net_Value', 'Top_month'])

df.groupby('Product_Id').apply(f).reset_index()

# Output

  Product_Id    Net_Value   Top_month
0   20             300         1
1   30             600         2

看看这个令人惊奇的答案,它对我有帮助,也可以在将来帮助你。

© www.soinside.com 2019 - 2024. All rights reserved.