如何在Pandas中将分组统计结果拼接为新的字符串列?
解决方案
步骤拆解
- 从
Timestamp列提取纯日期信息(匹配你按Date分组的需求) - 统计同一
(Date, Place, Sport)组合的出现次数 - 将次数与运动名称拼接成
"Nx sport"格式的字符串 - 按
(Date, Place)分组,把同组的拼接结果用逗号分隔合并
可复用代码实现
import pandas as pd def format_sport_summary(df): # 1. 从Timestamp提取日期(仅保留年月日部分) df['Date'] = df['Timestamp'].dt.date # 2. 按三级维度分组统计运动出现次数 sport_counts = df.groupby(['Date', 'Place', 'Sport']).size().reset_index(name='Count') # 3. 拼接成要求的格式字符串 sport_counts['Formatted_Sport'] = sport_counts.apply( lambda row: f"{row['Count']}x {row['Sport']}", axis=1 ) # 4. 按Date+Place分组,合并同组的运动字符串 result = sport_counts.groupby(['Date', 'Place'])['Formatted_Sport'].agg(', '.join).reset_index() return result # 示例调用(替换成你的数据框即可) # summary_df = format_sport_summary(your_dataframe)
原方法问题说明
你用groupby(['date', 'Place'])['Sport'].value_counts()得到的多级索引Series,重置索引后每一行是(Date, Place, Sport, 计数),若直接后续分组,容易因重复维度导致逻辑混乱。上面的方法先做三级分组统计,再拼接格式,最后两级分组合并,逻辑更清晰,不会出现分组异常。
示例效果
假设输入数据:
| Timestamp | Sport | Place |
|---|---|---|
| 2024-05-01 09:00:00 | basketball | Gym A |
| 2024-05-01 10:00:00 | basketball | Gym A |
| 2024-05-01 14:00:00 | tennis | Gym A |
| 2024-05-02 08:00:00 | soccer | Gym B |
处理后输出:
| Date | Place | Formatted_Sport |
|---|---|---|
| 2024-05-01 | Gym A | 2x basketball, 1x tennis |
| 2024-05-02 | Gym B | 1x soccer |
内容的提问来源于stack exchange,提问作者JeffN
相关产品推荐
相关产品推荐

