如何将DataFrame首列值转为新列?解决透视KeyError:0报错问题
问题修复与优化方案
一、修复pivot的KeyError问题
你的脚本报错是因为没有给每行数据分配唯一的分组标识,直接用temp_df.index的话,每个key-value对都有独立索引,pivot无法将同一行的多个键值对聚合到同一行,导致索引匹配失败。
修复步骤如下:
- 拆分每行数据时,给每行添加一个
row_id作为分组标识(比如行号); - pivot时用
row_id作为索引,确保同一行的键值对被正确聚合。
示例代码:
import pandas as pd import re # 示例数据(实际可从文件读取) data = [ "age=senior workclass=Self-emp-not-inc salary>50K", "age=middle workclass=Private salary<=50K" ] rows = [] # 给每行分配唯一row_id for row_idx, line in enumerate(data): pairs = line.split() for pair in pairs: # 处理两种格式的键值对:key=value 和 key>value/key<=value if '=' in pair: k, v = pair.split('=', 1) else: match = re.match(r'(\w+)([<>]=?)(\w+)', pair) if match: k = match.group(1) v = f"{match.group(2)}{match.group(3)}" else: k, v = pair, '' rows.append({'row_id': row_idx, 'column_names': k, 'column_values': v}) temp_df = pd.DataFrame(rows) # 用row_id作为索引进行pivot result_df = temp_df.pivot(index='row_id', columns='column_names', values='column_values').reset_index(drop=True) # 保存为CSV result_df.to_csv('output.csv', index=False)
二、更优的实现方法
其实不需要用pivot,直接将每行数据解析为字典,再批量生成DataFrame,代码更简洁高效,还能避免索引问题:
import pandas as pd import re def parse_single_line(line): """解析单行key-value格式数据为字典""" line_dict = {} for pair in line.split(): if '=' in pair: key, value = pair.split('=', 1) else: # 匹配salary>50K这类带比较符的格式 match = re.match(r'(\w+)([<>]=?)(\w+)', pair) if match: key = match.group(1) value = f"{match.group(2)}{match.group(3)}" else: key, value = pair, '' line_dict[key] = value return line_dict # 从文件读取数据(替换为你的文件路径) with open('input_data.txt', 'r', encoding='utf-8') as f: all_lines = f.read().splitlines() # 批量解析并生成DataFrame final_df = pd.DataFrame([parse_single_line(line) for line in all_lines]) # 输出CSV final_df.to_csv('result.csv', index=False)
这种方式直接将每行转为字典,pandas会自动将所有键作为列名,缺失的列会填充NaN,处理逻辑更直观,性能也比pivot更优。
内容的提问来源于stack exchange,提问作者dearn44
相关产品推荐
相关产品推荐

