如何为Pandas DataFrame的JSON格式列添加新键?
解决Pandas中为JSON列添加键值对的语法错误问题
问题场景
现有如下Pandas DataFrame:
import pandas as pd technologies = [ ("Spark", 22000,'30days',1000.0), ("PySpark",25000,'50days',2300.0), ("Hadoop",23000,'55days',1500.0) ] df = pd.DataFrame(technologies,columns = ['Courses','Fee','Duration','Discount'])
执行以下代码为DataFrame添加json列(值为JSON格式字符串):
import json df['json'] = [json.dumps(x) for x in df.to_dict(orient='records')]
此时想为json列的每个JSON对象添加'madeby'键(值为'Bae Systems'),但执行以下代码时出现语法错误:
df.apply(lambda row: json.loads(row['json'])['madeby'] = 'Bae Systems',axis=1) # 报错:SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
错误原因
lambda匿名函数只能包含单个表达式,不能包含赋值语句(=),因此直接在lambda里做键值赋值会触发语法错误。
解决方案
方法1:使用自定义函数配合apply
定义一个普通函数完成JSON解析、添加键、重新序列化的完整流程,再应用到json列:
import json def add_madeby_field(json_str): # 解析JSON字符串为字典 data_dict = json.loads(json_str) # 添加新键值对 data_dict['madeby'] = 'Bae Systems' # 重新序列化为JSON字符串 return json.dumps(data_dict) # 更新json列 df['json'] = df['json'].apply(add_madeby_field)
方法2:用表达式形式的lambda实现
利用字典解包生成新字典,将赋值操作转化为表达式,适配lambda的要求:
df['json'] = df['json'].apply(lambda x: json.dumps({**json.loads(x), 'madeby': 'Bae Systems'}))
方法3:从源头优化(更高效)
无需先生成JSON再修改,直接在生成JSON列时就添加目标键值对,避免重复解析序列化的开销:
df['json'] = [json.dumps({**record, 'madeby': 'Bae Systems'}) for record in df.to_dict(orient='records')]
内容的提问来源于stack exchange,提问作者asfand hikmat
相关产品推荐
相关产品推荐

