如何不使用Pandas等库用Python实现CSV数据透视?
解决无Pandas情况下的CSV字符串透视问题
我明白你现在的困境——不能用Pandas这类库,还要处理CSV字符串的透视转换,而且现有基于字典的方法卡在了缺失列值的处理上。咱们一步步来解决这个问题:
问题核心分析
你的输入CSV是键值对分组的结构(每一组对应一个用户的属性集合),而不是常规的行式数据。之前的代码错误地把所有同属性的值合并到一个列表里,没有按用户分组,这才导致缺失列处理失败。
解决方案步骤
- 按用户拆分数据组:每当遇到
Name属性时,就开启一个新的用户属性字典(因为每个用户都以Name开头) - 收集所有列名:遍历所有用户组,收集出现过的所有
AttributeName,作为最终CSV的表头 - 填充每行数据:对每个用户的属性字典,按表头顺序填充值,缺失的属性留空
- 生成目标CSV字符串:先写入表头,再逐行写入每个用户的完整数据
完整实现代码
import csv def pivot_csv_string(csv_string): reader = csv.reader(csv_string.split('\n'), delimiter=',') # 跳过表头行(AttributeName,Value) next(reader) users = [] current_user = {} all_columns = set() for row in reader: # 跳过空行 if not row or row[0].strip() == '': continue attr_name, attr_value = row[0].strip(), row[1].strip() # 遇到新的Name,保存当前用户并新建 if attr_name == 'Name' and current_user: users.append(current_user) current_user = {} # 添加当前属性到用户字典,同时记录列名 current_user[attr_name] = attr_value all_columns.add(attr_name) # 别忘了添加最后一个用户 if current_user: users.append(current_user) # 把列名排序(可选,也可以按出现顺序调整) sorted_columns = sorted(all_columns) # 生成CSV字符串 csv_output = [] # 写入表头 csv_output.append(','.join(sorted_columns)) # 写入每行数据 for user in users: row_values = [user.get(col, '') for col in sorted_columns] csv_output.append(','.join(row_values)) return '\n'.join(csv_output) # 测试你的输入 input_csv = """AttributeName,Value Name,John Gender,M PlaceofBirth,Texas Name,Alexa Gender,F SurName,Garden""" output_csv = pivot_csv_string(input_csv) print(output_csv)
代码说明
- 分组逻辑:通过
Name属性判断新用户的开始,确保每个用户的属性被正确归类到单独的字典中 - 列名收集:用集合
all_columns自动去重,确保所有出现过的属性都被作为表头 - 缺失值处理:用
user.get(col, '')来获取属性值,不存在的属性直接返回空字符串,完美适配缺失列的场景 - 空行处理:跳过输入中的空行,避免读取无效数据
运行这段代码后,你会得到完全符合预期的输出:
Name,Gender,PlaceofBirth,SurName
John,M,Texas,
Alexa,F,,Garden
内容的提问来源于stack exchange,提问作者Saurabh Saxena
相关产品推荐
相关产品推荐

