在 Pandas Dataframe 上按分组并使用 APPLY 和 MAX 操作 [重复]

Posted

技术标签:

【中文标题】在 Pandas Dataframe 上按分组并使用 APPLY 和 MAX 操作 [重复]【英文标题】:Group by and use APPLY and MAX operations on Pandas Dataframe [duplicate] 【发布时间】:2020-03-03 11:23:18 【问题描述】:

我有示例熊猫数据框

sample_df = pd.DataFrame(
'visitor_id' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'pagename' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'order_status' : ['accept', 'accept', 'accept', 'reject', 'reject', 'reject', 'reject', 'reject', 'reject'],
)

visitor_id  pagename    order_status
MM1       S1    accept
MM1       S1    accept
MM1       S3    accept
MM2       S3    reject
MM2       S4    reject
MM2       S4    reject
MM4       S2    reject
MM4       S2    reject
MM4       S2    reject

我正在尝试根据每个 visitor_id 的页面名称汇总旅程。我有这段代码来构建旅程 -

sample_journeys = sample_df.groupby(['visitor_id']) \
.apply(lambda x: ','.join(x.pagename)) \
.reset_index() 
sample_journeys.columns = ['visitor_id', 'page_paths']

输出为

    visitor_id  page_paths
0   MM1       S1,S1,S3
1   MM2       S3,S4,S4
2   MM4       S2,S2,S2

我还想在我的聚合操作中为每个 visitor_id 取一个 maxorder_status 列。所以输出应该有 3 列 -

visitor_id  page_paths  max_order_status
MM1       S1,S1,S3      accept
MM2       S3,S4,S4      reject
MM4       S2,S2,S2      reject

如何在 Pandas 中执行 1 次聚合?

我尝试了类似的东西

sample_journeys = sample_df.groupby(['visitor_id']) \
.apply(lambda x: ','.join(x.pagename)) \
.agg('order_status': ['max']) \ 
.reset_index() 

但它因一些错误而失败 - unexpected character after line continuation character

我还想在聚合后将列名的最终数据框重命名为[visitor_id, page_paths, max_order_status],我觉得这很困难。

【问题讨论】:

【参考方案1】:

用途:

new_df=( sample_df.groupby('visitor_id',sort=False)
                  .agg(page_paths=('pagename',lambda x: ','.join(x)),
                       max_order_status=('order_status','max')) 
                  .reset_index() )
print(new_df)

输出

  visitor_id page_paths max_order_status
0        MM1   S1,S1,S3           accept
1        MM2   S3,S4,S4           reject
2        MM4   S2,S2,S2           reject

【讨论】:

当我使用它时,列名出现在 2 行中。然后,当我将您的代码更改为 sample_df.groupby('visitor_id').agg(page_paths=('pagename',lambda x: ','.join(x)),max_order_status=('order_status','max')).reset_index() 它适用于 1 行中的所有列名 这是您的预期出发吗?你能用我的代码展示你得到什么吗? :) 没关系,我没看到你的代码有reset_index()。感谢您的回答,它就像一个魅力。 reset_index() 有什么作用? 我后来添加了reset_indexreset_index 重置索引。当前索引变成一列而新的索引是0,1,2……你可以在这里看到:pandas.pydata.org/pandas-docs/stable/reference/api/…

以上是关于在 Pandas Dataframe 上按分组并使用 APPLY 和 MAX 操作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组len函数和nunique函数计算分组的个数(分组包含多个dataframe)

Pandas Dataframe 中分组的多重聚合

Python,Pandas Dataframe 在分组后取回索引

pandas 有两个dataframe ,求各个分组之间的相除后的均值

按日期对 Pandas DataFrame 进行分组

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用groups属性获取每个分组的样本对应的在原dataframe中的行索引位置列表