如何用Pandas实现按日期分组并转换为指定格式的DataFrame?
解决方案
首先修正你代码里的语法错误:['Value]漏了闭合引号,不过就算修正后,这种方式得到的是每行存列表的结构,没法直接展开成你要的多行多列格式。下面是两种直接实现需求的方法:
方法1:用cumcount生成组内序号 + pivot透视
这是最直观的方式,先给每个日期组内的行添加一个连续序号,再通过透视把日期转成列:
import pandas as pd # 构造你的原始DataFrame df = pd.DataFrame({ 'Value': [1,2,3,4,5,6,7,8,9], 'Date': ['2022-01-01']*3 + ['2022-01-02']*3 + ['2022-01-03']*3 }) # 生成每个日期组内的行序号 df['row_idx'] = df.groupby('Date').cumcount() # 透视转换:行是组内序号,列是日期,值是Value result = df.pivot(index='row_idx', columns='Date', values='Value') # 调整索引和列名格式,匹配你想要的输出 result.index.name = 'Date' result.columns.name = None print(result)
运行后输出就是你要的结果:
Date 2022-01-01 2022-01-02 2022-01-03 0 1 4 7 1 2 5 8 2 3 6 9
方法2:用set_index + unstack快速实现
这种方式更简洁,一步到位:
result = df.set_index([df.groupby('Date').cumcount(), 'Date'])['Value'].unstack() result.index.name = 'Date' result.columns.name = None
为什么你的原代码不行?
你写的df.groupby('Date')['Value'].apply(list).to_frame.T(修正引号后)会生成一个单行DataFrame,每个单元格是对应日期的Value列表,比如:
Date 2022-01-01 2022-01-02 2022-01-03 0 [1,2,3] [4,5,6] [7,8,9]
这和你需要的把列表展开成多行的结构完全不同,所以没法直接用。
内容的提问来源于stack exchange,提问作者DataScienceNovice
相关产品推荐
相关产品推荐

