You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:01:30