如何导入CSV的数值列及JSON列中指定位置的变量?
当然可以通过位置序号来提取JSON里的指定变量!尤其是你的JSON里还存在重复键名(比如示例里的两个Lon),用位置选择反而比靠键名找靠谱得多——毕竟重复键名在常规解析时会被后面的覆盖,根本没法通过键名精准拿到你要的那一个。
方法一:用Python Pandas 按位置提取(最灵活稳妥)
这是处理这类需求最常用的方案,能完美应对重复键的问题:
首先导入需要的库:
import pandas as pd import json
读取你的CSV文件:
df = pd.read_csv('your_data.csv') # 替换成你的实际文件名
接下来写一个自定义函数,用来解析JSON并按位置提取元素——关键是用object_pairs_hook=list把JSON解析成有序的键值对列表,这样就能保留原始顺序,不会丢失重复键的数据:
def extract_json_by_pos(json_str, target_positions): # 解析JSON为有序键值对列表(保留原始顺序) parsed_json = json.loads(json_str, object_pairs_hook=list) # 按传入的位置序号提取元素,给重复键加位置后缀区分 extracted = {} for idx in target_positions: if idx < len(parsed_json): key, value = parsed_json[idx] extracted[f"{key}_{idx+1}"] = value # 比如Lon_1, Lon_2,避免键名冲突 return extracted
然后把这个函数应用到你的JSON列上,比如你想提取第1个(索引0)和第4个(索引3)元素:
# 示例:提取位置0(Building Lat)和位置3(第二个Lon) extracted_data = df['response'].apply(lambda x: extract_json_by_pos(x, [0, 3])) # 合并原有数值列和提取的JSON数据 final_df = pd.concat([df[['address', 'zip']], pd.DataFrame(extracted_data.tolist())], axis=1)
这样你就得到了包含原有两列,加上你按位置选中的JSON变量的数据集。
注意:这里的位置序号是从0开始计数的,对应示例里的JSON:
{"Building Lat": "74.91", "Lon": "31.21", "Front Lat": "75.93", "Lon": "32.20"}各元素的位置对应关系:
- 0: ("Building Lat", "74.91")
- 1: ("Lon", "31.21")
- 2: ("Front Lat", "75.93")
- 3: ("Lon", "32.20")
方法二:用命令行工具组合(适合快速处理)
如果你习惯用命令行,也可以用jq配合csvkit来实现:
- 先提取出CSV里的JSON列:
csvcut -c response your_data.csv > json_column.txt
- 用
jq按位置提取(to_entries会把对象转成有序数组,索引从0开始):
jq -r 'to_entries | [.[0].value, .[3].value] | @csv' json_column.txt > extracted_json.csv
- 最后把原有数据和提取的JSON数据合并:
csvjoin -c 1,1 your_data.csv extracted_json.csv > final_output.csv
小提醒:部分版本的
jq在处理重复键时,可能会默认保留最后一个键,所以如果你的JSON重复键较多,还是优先用Python的方法更稳妥。
内容的提问来源于stack exchange,提问作者Agustín Indaco
相关产品推荐
相关产品推荐

