如何使用Python和Pandas将DataFrame中的行转换为列(CSV数据源场景)
嘿,我来帮你搞定这个问题!要把cases数据转换成以week 1、week 2...为列的格式,本质上是把长格式数据转成宽格式,用Pandas的pivot()或pivot_table()方法就能轻松实现,我分常见场景给你讲具体操作:
场景1:CSV里已经有现成的周数列
假设你的原始CSV数据结构是这样的(比如包含分组列、周数、cases):
region,week,cases 华北,1,120 华北,2,150 华南,1,90 华南,2,110
操作步骤:
- 先读取CSV文件:
import pandas as pd # 替换成你的CSV文件路径 df = pd.read_csv('your_cases_data.csv')
- 用
pivot()转成宽格式:
如果你的数据里,每个分组+周数的组合是唯一的(没有重复记录),直接用pivot():
# 按region作为行索引,week作为列,cases作为值 pivoted_df = df.pivot(index='region', columns='week', values='cases') # 把列名改成"week 1"、"week 2"的格式 pivoted_df.columns = [f'week {col}' for col in pivoted_df.columns] # 可选:把行索引(region)转成普通列 pivoted_df = pivoted_df.reset_index()
如果同一分组+周数有重复的cases记录(比如同一天多次上报),就用pivot_table()指定聚合方式(比如求和/取平均):
pivoted_df = df.pivot_table( index='region', columns='week', values='cases', aggfunc='sum' # 可替换成'mean'、'max'等,根据你的需求选择 ) # 同样重命名列并重置索引 pivoted_df.columns = [f'week {col}' for col in pivoted_df.columns] pivoted_df = pivoted_df.reset_index()
最终效果:
处理后的数据会变成这样:
region week 1 week 2 0 华北 120 150 1 华南 90 110
场景2:CSV只有日期列,需要先提取周数
如果你的原始数据只有日期和cases,没有现成的周数列,那先从日期里提取周数再转格式:
假设原始CSV是这样的:
region,date,cases 华北,2024-01-01,30 华北,2024-01-05,40 华北,2024-01-08,50 华南,2024-01-02,25 华南,2024-01-06,35
操作步骤:
- 读取数据并转换日期格式:
import pandas as pd df = pd.read_csv('your_cases_data.csv') # 把date列转换成datetime类型 df['date'] = pd.to_datetime(df['date'])
- 提取周数:
# 提取ISO标准周数(推荐,避免跨年周数混乱) df['week'] = df['date'].dt.isocalendar().week
- 然后重复场景1的
pivot()或pivot_table()步骤即可,最终同样得到以week 1、week 2为列的宽格式数据。
补充小技巧:
- 如果你的数据没有分组列(只有周数和cases),可以把index设为一个临时列,或者直接用:
pivoted_df = df.pivot(columns='week', values='cases').rename(columns=lambda x: f'week {x}').reset_index(drop=True)
- 处理缺失值:如果某些周没有数据,结果里会出现
NaN,可以用fillna(0)填充为0:pivoted_df = pivoted_df.fillna(0)
内容的提问来源于stack exchange,提问作者standardmarcelo
相关产品推荐
相关产品推荐

