基于数组值动态拆分CSV列的技术需求
处理CSV中JSON格式标签列的动态列拆分
问题描述
现有如下格式的CSV数据:
| ID | tag | exists |
|---|---|---|
| 1 | [{"tag_uuid":"1a","tag_key":"tag1","tag_value":"value1 ","added_at":"2022-07-27T20:47:07.496Z"},{"tag_uuid":"1b","tag_key":"tag2","tag_value":"value2","added_at":"2022-07-27T20:47:07.480Z"}] | TRUE |
| 2 | [{"tag_uuid":"1a","tag_key":"tag1","tag_value":"value2","added_at":"2022-07-27T20:47:07.484Z"},{"tag_uuid":"1c","tag_key":"tag3","tag_value":"value1","added_at":"2022-07-27T20:47:07.409Z"}] | TRUE |
| 3 | [{"tag_uuid":"1c","tag_key":"tag3","tag_value":"value3","added_at":"2022-08-11T17:31:53.915Z"}] | TRUE |
需要将tag列中的tag_key动态拆分为独立列,并将对应的tag_value填充到对应行的位置;若列已存在则直接填充值,最终得到如下格式的表格:
| ID | exists? | tag1 | tag2 | tag3 |
|---|---|---|---|---|
| 1 | TRUE | value1 | value2 | |
| 2 | TRUE | value2 | value1 | |
| 3 | TRUE | value3 |
解决方案(Python实现)
用pandas结合json模块可以高效完成这个需求,步骤清晰且易扩展:
1. 安装依赖(若未安装)
pip install pandas
2. 实现代码
import pandas as pd import json # 读取原始CSV数据(替换为你的文件路径) df = pd.read_csv('input.csv', sep='|', skipinitialspace=True) # 清理列名的多余空格 df.columns = df.columns.str.strip() # 移除分隔符导致的空列 df = df.dropna(axis=1, how='all') # 解析tag列的JSON,收集所有tag_key和对应行的tag值 all_tag_keys = set() tag_data_list = [] for tags_str in df['tag']: # 清理字符串前后空格,避免JSON解析报错 clean_tags_str = tags_str.strip() tags = json.loads(clean_tags_str) row_tag_dict = {} for tag in tags: key = tag['tag_key'] value = tag['tag_value'].strip() # 清理值的多余空格 row_tag_dict[key] = value all_tag_keys.add(key) tag_data_list.append(row_tag_dict) # 将tag数据转为DataFrame,按字母顺序排列列 tags_df = pd.DataFrame(tag_data_list, columns=sorted(all_tag_keys)) # 合并原始ID、exists列与拆分后的tag列,重命名exists列为exists? result_df = pd.concat([df[['ID', 'exists']].rename(columns={'exists': 'exists?'}), tags_df], axis=1) # 将空值替换为空字符串(可选,按需调整) result_df = result_df.fillna('') # 打印结果到控制台 print(result_df.to_string(index=False)) # 保存结果到新CSV文件 result_df.to_csv('output.csv', index=False)
代码说明
- 先处理原始CSV的格式问题:清理列名空格、移除空列,避免后续解析出错
- 遍历每行的
tag列,解析JSON字符串,提取tag_key和tag_value,同时收集所有唯一的tag_key作为新列名 - 将提取的tag数据转为DataFrame,与原始的ID、exists列合并
- 最后可选择输出到控制台或保存为新CSV文件
内容的提问来源于stack exchange,提问作者Lee Cable
相关产品推荐
相关产品推荐

