Python实现DataFrame拆分列值提取前缀为表头并填充数据求助
交通数据格式转换解决方案
针对你的需求,这里提供一套批量处理的Python方案,无需逐列操作,适配大数量级数据:
核心思路
先把宽格式的原数据转成便于统一处理的长格式,拆分所有meters:seconds对,再重新构建成目标格式的宽表,自动填充缺失值。
完整代码实现
import pandas as pd # ---------------------- # 1. 读取你的数据(替换成实际读取方式) # ---------------------- # 示例:从CSV读取,实际改成你的文件路径 df = pd.read_csv('your_traffic_data.csv') # ---------------------- # 2. 转长格式并拆分数据 # ---------------------- # 保留原行索引,将所有列的数据转为行记录 long_df = df.reset_index().melt(id_vars='index', var_name='原列名', value_name='meter_second') # 拆分meter和second,生成两列;处理可能的空值 def split_ms(x): if pd.isna(x) or x.strip() == '': return [pd.NA, pd.NA] parts = x.split(':') return parts if len(parts) == 2 else [pd.NA, pd.NA] long_df[['meter', 'second']] = long_df['meter_second'].apply(split_ms).apply(pd.Series) # 转换数据类型:meter转整数,second转浮点数 long_df['meter'] = pd.to_numeric(long_df['meter'], errors='coerce') long_df['second'] = pd.to_numeric(long_df['second'], errors='coerce') # ---------------------- # 3. 提取并排序所有唯一meter值 # ---------------------- sorted_meters = sorted(long_df['meter'].dropna().unique()) # ---------------------- # 4. 构建目标DataFrame # ---------------------- # 转成宽表,缺失值自动填充NaN new_df = long_df.pivot(index='index', columns='meter', values='second') # 按排序后的meter值调整列顺序 new_df = new_df[sorted_meters] # 重置索引名(可选,让表格更整洁) new_df.index.name = None new_df.columns.name = None # 查看结果 print(new_df.head())
关键步骤说明
- 转长格式:用
melt把原DataFrame的每一列数据转为单行记录,避免逐列循环处理,适配任意列数。 - 批量拆分:用
apply批量处理所有meters:seconds字符串,同时处理空值和异常格式,避免报错。 - 自动填充缺失值:
pivot方法会自动将不存在的meter-second对填充为NaN,无需手动处理。 - 适配大数据:这套方法基于pandas的矢量化操作,效率远高于循环,能轻松处理你提到的98列290行甚至更大的数据集。
内容的提问来源于stack exchange,提问作者Omicron
相关产品推荐
相关产品推荐

