如何从含JSON列表的Pandas列中提取代码列表?
问题:提取DataFrame中JSON数组的code字段组成新列
这是我第一次在StackOverflow上提问,请手下留情。
我有一个Pandas DataFrame,其中包含一个存储JSON数组的fieldOfInterest列,示例如下:
In: df = pd.DataFrame([ ["1", [{"code":"FOI_AGRICULTURE_FOOD|FOI_AF_FOOD_INDUSTRY"}, {"code":"FOI_AGRICULTURE_FOOD|FOI_AF_FORESTRY"}]], ["2", [{"code":"FOI_AGRICULTURE_FOOD|FOI_AF_SOMETHING_ELSE"}, {"code":"FOI_AGRICULTURE_FOOD|FOI_AF_FORESTRY"}]] ], columns = ["id", "fieldOfInterest"]) df Out: id fieldOfInterest 0 1 [{'code': 'FOI_AGRICULTURE_FOOD|FOI_AF_FOOD_IN... 1 2 [{'code': 'FOI_AGRICULTURE_FOOD|FOI_AF_SOMETHI...
我想要添加一个新列,每行的值为原列对应条目中所有code元素组成的列表,例如第一行的结果为:
['FOI_AGRICULTURE_FOOD|FOI_AF_FOOD_INDUSTRY', 'FOI_AGRICULTURE_FOOD|FOI_AF_FORESTRY']
我有一个适用于单行的解决方案:
foi_normalized = pd.json_normalize(df["fieldOfInterest"].iloc[1]) foi_codes = foi_normalized["code"] foi_list = foi_codes.tolist() print(foi_list)
但当我尝试对整列使用类似方法时:
def interest_reader(foi_old): foi_normalized = pd.json_normalize(foi_old) foi_codes = foi_normalized["code"] foi_list = foi_codes.tolist() return foi_list df["fieldsOfInterest_new"] = df["fieldOfInterest"].apply(interest_reader)
出现了如下错误:
File "...", line 15, in <module> df["fieldsOfInterest_new"] = df["fieldOfInterest"].apply(interest_reader) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "...", line 4771, in apply return SeriesApply(self, func, convert_dtype, args, kwargs).apply() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "...", line 1105, in apply return self.apply_standard() ^^^^^^^^^^^^^^^^^^^^^ File "...", line 1156, in apply_standard mapped = lib.map_infer( ^^^^^^^^^^^^^^ File "pandas\_libs\lib.pyx", line 2918, in pandas._libs.lib.map_infer File "...", line 11, in interest_reader foi_normalized = pd.json_normalize(foi_old) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "...", line 446, in _json_normalize raise NotImplementedError NotImplementedError
我尝试了其他几种方法但都无效,现在考虑直接将值视为字典,遍历每个条目获取code键对应的值。希望能得到一些指导,谢谢!
解决方案
你不需要用pd.json_normalize处理单行数据,直接遍历列表中的字典提取code值即可,更高效且不会报错。
方法1:用列表推导式结合apply
df["fieldsOfInterest_new"] = df["fieldOfInterest"].apply( lambda x: [item["code"] for item in x] )
方法2:自定义函数实现
def extract_codes(foi_list): return [item["code"] for item in foi_list] df["fieldsOfInterest_new"] = df["fieldOfInterest"].apply(extract_codes)
运行后DataFrame新增目标列,结果示例:
id fieldOfInterest fieldsOfInterest_new 0 1 [{'code': 'FOI_AGRICULTURE_FOOD|FOI_AF_FOOD_IN... [FOI_AGRICULTURE_FOOD|FOI_AF_FOOD_INDUSTRY, FOI_AGRICULTURE_FOOD|FOI_AF_FORESTRY] 1 2 [{'code': 'FOI_AGRICULTURE_FOOD|FOI_AF_SOMETHI... [FOI_AGRICULTURE_FOOD|FOI_AF_SOMETHING_ELSE, FOI_AGRICULTURE_FOOD|FOI_AF_FORESTRY]
原方法报错原因
pd.json_normalize设计用于处理数据集级别的JSON对象列表,当你用apply传入单行列表时,内部处理逻辑触发了未实现的分支,因此抛出NotImplementedError。直接遍历字典提取值是更适配场景的方式。
内容的提问来源于stack exchange,提问作者Zarasophos
相关产品推荐
相关产品推荐

