我有一个账单详细信息数据集,我想根据产品的总价值对产品进行分组,另外我想要一列来指示相应产品产生最多收入的月份
数据集:
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
这只是一个样本数据集我有全年的交易数据
使用
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
假设根据 Net_Revenue 的最大总和,您只需要 1 个最高月份值,下面是可能适合您的代码。
我们可以通过以下三个阶段来实现这一目标:
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
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
final_df = df_1.merge(df_2)
print(final_df)
Product_Id Total_revenue Month
0 20 300 1
1 30 600 2
对@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)
)
由于多列正在交互,除了
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
看看这个令人惊奇的答案,它对我有帮助,也可以在将来帮助你。