如何将多行CSV时序数据转换为按企业列展示的宽表格式?
解决CSV长格式转宽格式的问题
你需要的是数据重塑,把长格式(long format)转换为宽格式(wide format),Pandas里用pivot或pivot_table就能直接实现,完全不需要低效的嵌套循环,处理30万行数据也能高效完成。
步骤1:读取数据
先加载CSV,自动解析日期列以方便后续处理:
import pandas as pd # 读取CSV文件,指定解析日期列 df = pd.read_csv('your_file.csv', parse_dates=['Date and time'])
步骤2:转换为宽格式
情况1:同一时间+企业唯一对应一条记录
直接用pivot方法完成结构转换:
# 重塑数据:日期作为行索引,企业名作为列名,用电量作为对应值 wide_df = df.pivot( index='Date and time', columns='Company', values='Usage' ).reset_index() # 可选:将日期从索引转回普通列,匹配你给出的示例格式 # 可选:把缺失值(某时间某企业无数据)补为0 wide_df = wide_df.fillna(0)
转换后的数据结构完全符合你的需求:日期列在前,每个企业作为独立列,对应时间的用电量填充到对应位置。
情况2:同一时间+企业存在多条记录(如重复数据)
如果数据里存在同一时间同一企业的多条用电量记录,用pivot_table指定聚合方式避免报错:
wide_df = df.pivot_table( index='Date and time', columns='Company', values='Usage', aggfunc='sum', # 重复数据求和,也可根据需求用'mean'等聚合方式 fill_value=0 # 直接将缺失值补为0 ).reset_index()
步骤3:保存结果
把转换后的宽格式数据导出为新CSV:
wide_df.to_csv('wide_format_data.csv', index=False)
你之前方法无效的原因
df.groupby('Company')['Usage']仅完成了数据分组,没有改变数据结构,它返回的是分组对象,需要配合聚合函数才能得到统计结果,但不是你要的宽格式结构。- 嵌套循环写法逻辑错误:遍历
df得到的是列名而非行数据,且df[][]的索引方式不符合Pandas规范;同时循环处理30万行数据效率极低,完全不适合这类数据场景。
内容的提问来源于stack exchange,提问作者olividir
相关产品推荐
相关产品推荐

