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
相关产品推荐
相关产品推荐

