Pythonic方式提取DataFrame字典列表ibans值遇TypeError报错求助
问题解决:提取DataFrame字典列表中的指定字段并处理缺失值
报错原因
B.ibans列存在大量缺失值(存储为NaN,属于float类型),迭代时无法遍历float对象,触发TypeError: 'float' object is not iterable。- 原代码逻辑错误:
wip_r['B.ibans'][d]是完全错误的索引方式,无需引用整个列的元素,应直接遍历当前行的字典列表。
解决方案
方案1:带空值判断的列表推导式
直接在推导式中先判断当前行是否为有效列表,再提取ibans值:
wip_r['banking_country'] = [ [item['ibans'] for item in lst] if isinstance(lst, list) else [] for lst in wip_r['B.ibans'] ]
若希望缺失值对应结果为NaN而非空列表,可调整为:
import pandas as pd wip_r['banking_country'] = [ [item['ibans'] for item in lst] if isinstance(lst, list) else pd.NA for lst in wip_r['B.ibans'] ]
方案2:Pandas apply 方法(更简洁)
用apply结合自定义函数处理,同时覆盖空值场景:
import pandas as pd def extract_ibans(lst): if isinstance(lst, list): return [item['ibans'] for item in lst] return pd.NA # 需求不同可改为返回[] wip_r['banking_country'] = wip_r['B.ibans'].apply(extract_ibans)
方案3:兼容单个字典的场景
如果B.ibans列中存在单个字典而非列表的情况,可完善判断逻辑:
wip_r['banking_country'] = [ [item['ibans'] for item in lst] if isinstance(lst, list) else [lst['ibans']] if isinstance(lst, dict) else pd.NA for lst in wip_r['B.ibans'] ]
测试验证
用包含缺失值的示例数据测试:
data = [ ['first_name', 'last_name', 'B.ibans'], ['Charles', 'George', [{"id": "54214312", "bic": "ABC", "ibans": "UK421"}]], ['Alice', 'Smith', pd.NA] # 模拟缺失值 ] wip_r = pd.DataFrame(data=data[1:], columns=data[0])
应用方案1代码后,结果如下:
| first_name | last_name | B.ibans | banking_country |
|---|---|---|---|
| Charles | George | [{'id': '54214312', ...}] | ['UK421'] |
| Alice | Smith |
内容的提问来源于stack exchange,提问作者Hugoz13
相关产品推荐
相关产品推荐

