如何在Python DataFrame中从OverallRatio列提取数据生成A-F列
从DataFrame的OverallRatio字段拆分生成A-F列的解决方案
需求说明
- 现有DataFrame包含
OverallRatio字段,需生成A、B、C、D、E、F六列 - 拆分规则:按分号
;分割OverallRatio内容,每个分割元素为「数字:数值」格式 - 映射规则:数字1→A,2→B,3→C,4→D,5→E,6→F,对应数值填入目标列,其余列填0
示例输入输出
输入DataFrame:
OverallRatio 0 1:0.25; 3:0.33; 5:0.5 1 5:0.25; 6: 0.75 2 1:0.5; 6:0.33 3 2:0.25; 4:0.5
输出结果:
| OverallRatio | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 1:0.25; 3:0.33; 5:0.5 | 0.25 | 0.00 | 0.33 | 0.00 | 0.50 | 0.00 |
| 5:0.25; 6: 0.75 | 0.00 | 0.00 | 0.00 | 0.00 | 0.25 | 0.75 |
| 1:0.5; 6:0.33 | 0.50 | 0.00 | 0.00 | 0.00 | 0.00 | 0.33 |
| 2:0.25; 4:0.5 | 0.00 | 0.25 | 0.00 | 0.50 | 0.00 | 0.00 |
实现代码(Pandas)
import pandas as pd # 构造示例数据(替换为你的真实DataFrame) df = pd.DataFrame({ 'OverallRatio': [ '1:0.25; 3:0.33; 5:0.5', '5:0.25; 6: 0.75', '1:0.5; 6:0.33', '2:0.25; 4:0.5' ] }) # 1. 拆分字符串并展开为多行,方便逐个处理键值对 temp = df.assign(ratio=df['OverallRatio'].str.split(';')).explode('ratio') # 2. 提取数字(列编号)和数值,同时清理前后空格 temp[['col_num', 'value']] = temp['ratio'].str.strip().str.extract(r'(\d+):(\d+\.?\d*)', expand=True) # 3. 转换数据类型,确保数值为浮点型 temp['col_num'] = temp['col_num'].astype(int) temp['value'] = temp['value'].astype(float) # 4. 映射列编号到目标列名 col_mapping = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F'} temp['col_name'] = temp['col_num'].map(col_mapping) # 5. 透视转换为宽表,空值填充为0 pivot_result = temp.pivot(index=temp.index, columns='col_name', values='value').fillna(0) # 6. 合并回原DataFrame,调整列顺序 final_df = pd.concat([df, pivot_result], axis=1) final_df = final_df[['OverallRatio', 'A', 'B', 'C', 'D', 'E', 'F']] # 查看结果 print(final_df)
代码说明
str.split(';').explode():将每个OverallRatio的多个键值对拆分成单独行,便于逐个处理str.extract():用正则表达式提取数字和数值,处理可能存在的空格pivot():将长表转换为宽表,自动匹配列名,空值用0填充- 最后合并回原数据,确保保留原始字段并按需求排序列
内容的提问来源于stack exchange,提问作者ram prasad
相关产品推荐
相关产品推荐

