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

Python中如何从DataFrame每行提取多值?解决currencies列字典列表的code值提取至c_codes列问题

问题分析与解决方案

先帮你拆解循环逻辑里的坑,再给出更简洁高效的实现方法——你的问题大概率是踩了列表引用的陷阱,或者临时列表的初始化方式不对。

一、你的循环逻辑可能的错误点

最常见的问题是复用临时列表时的引用问题:如果你在循环外定义了一个temp列表,每次处理完一行后用temp.clear()清空,那么list_of_currencies里存储的是temp的引用,清空temp会同时清空已经添加到大列表里的内容,最终得到全空的list_of_currencies。

举个典型错误示例:

list_of_currencies = []
temp = []
for row in df2['currencies']:
    for d in row:
        temp.append(d['code'])
    list_of_currencies.append(temp)
    temp.clear()  # 这里会把list_of_currencies里刚添加的temp也清空!

如果得到的是平级的所有code值,那可能是你把内层循环的结果直接append到了大列表里,没有为每行创建独立的子列表——相当于跳过了“先收集每行code到临时列表”的步骤。

二、正确的循环写法

要避免引用问题,为每行新建一个临时列表即可,不要复用同一个:

list_of_currencies = []
for row in df2['currencies']:
    # 每行都初始化全新的临时列表
    temp = []
    for d in row:
        temp.append(d['code'])
    list_of_currencies.append(temp)

# 最后赋值给c_codes列
df2['c_codes'] = list_of_currencies

这样每行的temp都是独立的,不会互相影响,最终list_of_currencies就是包含子列表的结构,完美对应每行的code集合。

三、更简便的实现方式(推荐)

用Pandas的apply方法结合列表推导式,一行就能搞定,比循环更简洁高效:

# 统一返回列表(单个code时也返回['AFN'])
df2['c_codes'] = df2['currencies'].apply(lambda x: [d['code'] for d in x])

如果想和你示例完全匹配——单个code时返回字符串(如AFN),多个时返回列表(如['AUD','GBP']),可以加个长度判断:

df2['c_codes'] = df2['currencies'].apply(lambda x: x[0]['code'] if len(x) == 1 else [d['code'] for d in x])

你也可以直接用嵌套列表推导式生成整列内容:

df2['c_codes'] = [[d['code'] for d in row] for row in df2['currencies']]

验证示例

假设你的df2是这样的测试数据:

import pandas as pd
df2 = pd.DataFrame({
    'currencies': [
        [{'code': 'AFN'}],
        [{'code': 'USD'}, {'code': 'EUR'}],
        [{'code': 'AUD'}, {'code': 'GBP'}]
    ],
    'c_codes': [None, None, None]
})

用推荐方法处理后,df2['c_codes']会变成:

0          [AFN]
1    [USD, EUR]
2    [AUD, GBP]
Name: c_codes, dtype: object

完全符合你的需求。

内容的提问来源于stack exchange,提问作者Anorakk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:07:33