如何在Pandas中将DataFrame按日期聚合并将指定行数转换为列?
解决方案:Pandas实现日期分组行转列
这个需求我之前处理过,用reshape或melt确实不太贴合场景,试试groupby+cumcount+pivot的组合方案,完美适配你的需求!
步骤1:给每个日期组内的行添加序号
首先得给每个timestamp分组里的每一行分配一个组内序号,这样后续才能把这些行对应到top1、top2...top25的列上。用cumcount()就能轻松实现,它默认从0开始计数,所以我们加1让序号从1开始:
import pandas as pd # 假设你的原始DataFrame名为df df['rank'] = df.groupby('timestamp')['title'].cumcount() + 1
这一步后,你的数据会变成这样的结构:
| title | timestamp | rank |
|---|---|---|
| String one | 2016-12-02 | 1 |
| String two | 2016-12-02 | 2 |
| ... | ... | ... |
| String twenty-five | 2016-12-02 | 25 |
| String twenty-six | 2016-12-03 | 1 |
| ... | ... | ... |
步骤2:用pivot实现行转列
接下来用pivot方法把行转成列,指定索引为timestamp,列是刚生成的rank(还要把列名改成top N的格式),值就是title:
# 执行行转列操作 result_df = df.pivot(index='timestamp', columns='rank', values='title') # 重命名列,把1、2...25改成top1、top2...top25的格式 result_df.columns = [f'top {col}' for col in result_df.columns] # 可选:把timestamp从索引转回普通列 result_df = result_df.reset_index()
最终结果验证
运行完上面的代码,你就能得到完全符合预期的DataFrame:
| timestamp | top 1 | top 2 | ... | top 25 |
|---|---|---|---|---|
| 2016-12-02 | String one | String two | ... | String twenty-five |
| 2016-12-03 | String twenty-six | String twenty-seven | ... | String fifty |
额外补充
- 如果数据集里存在某日期行数不等于25的情况,
pivot会自动在缺失位置填充NaN,你可以用result_df.fillna('')把空值替换成空字符串,或者根据业务需求做其他处理。 - 这个方案完全适配大规模数据(数年的日期数据),pandas的这些方法效率很高,不用担心性能问题。
内容的提问来源于stack exchange,提问作者Rhishab Mukherjee
相关产品推荐
相关产品推荐

