请求优化Pandas代码:将ADC_TYPE列按值拆分至独立列(适配大数据量)
优化后的Pandas拆分ADC_TYPE列方案
针对数十万行数据、16种唯一ADC_TYPE的场景,以下是高效简洁的Pandas实现方案,可保持原始RAW数据及对应ADC值的顺序不变:
核心思路
利用Pandas内置的pivot或groupby+unstack方法(均为矢量优化操作,性能远优于循环),将ADC_TYPE列的不同值拆分为独立列,同时通过指定索引和列顺序保留原始数据的顺序。
假设原始数据结构
假设你的DataFrame(命名为df)包含以下核心列:
RAW_ID:RAW数据的唯一标识(用于分组,确保同一RAW数据的所有ADC值归到同一行)ADC_TYPE:ADC类型(共16种唯一值)VALUE:对应ADC_TYPE的测量值
高效实现代码
方案1:使用pivot(无重复RAW_ID+ADC_TYPE组合时首选)
# 获取ADC_TYPE的原始出现顺序(可选,若需保持列顺序与首次出现一致) adc_col_order = df['ADC_TYPE'].unique() # 执行 pivot 操作,拆分列并保留RAW_ID顺序 pivoted_df = df.pivot( index='RAW_ID', columns='ADC_TYPE', values='VALUE' )[adc_col_order].reset_index() # 重置列名(移除多级索引) pivoted_df.columns.name = None
方案2:使用groupby+unstack(存在重复组合时更稳健)
若同一RAW_ID+ADC_TYPE存在多条记录,可指定聚合函数(如取第一条、均值等):
adc_col_order = df['ADC_TYPE'].unique() # 分组后拆列,聚合方式选'first'保留首次出现的值 pivoted_df = df.groupby(['RAW_ID', 'ADC_TYPE'])['VALUE'].first()\ .unstack(fill_value=0)[adc_col_order]\ .reset_index() pivoted_df.columns.name = None
关键优化点
- 避免循环/逐行操作:上述方法均为Pandas底层优化的矢量操作,处理数十万行数据仅需毫秒级时间。
- 保留原始顺序:通过
df['ADC_TYPE'].unique()获取原始列顺序,确保拆分后的列顺序与数据中首次出现的ADC_TYPE一致;RAW_ID的顺序则由原始DataFrame的出现顺序自动保留。 - 处理缺失值:
unstack的fill_value参数可指定缺失值填充值(如0或NaN),适配实际业务场景。
示例输出格式
| RAW_ID | ADC_01 | ADC_02 | ... | ADC_16 |
|---|---|---|---|---|
| 1001 | 234 | 567 | ... | 890 |
| 1002 | 123 | 456 | ... | 789 |
内容的提问来源于stack exchange,提问作者John Houlihan
相关产品推荐
相关产品推荐

