Pandas字典列表列提取导演名称的代码运行逻辑疑问
问题解答
疑问1 为什么函数不需要嵌套循环
你实际是通过df.apply(get_directors, axis=1)调用的该函数,axis=1参数指定按行遍历,每次传入函数的dataframe参数不是完整DataFrame,而是单行的Series对象:
- 此时
dataframe['crew']取到的就是当前行对应的crew字段值,也就是你示例中的字典列表结构[{'job': 'Director', 'name':'ABC'}, {'job':'Producer', 'name':'XYZ'}] - 直接遍历这个列表,拿到的
elements就是列表中的每一个字典,自然不需要再加一层嵌套循环 - 你最早报
'Float' object is not iterable错误的原因是部分行的crew字段为缺失值,Pandas中空值默认以NaN(浮点类型)存储,直接遍历浮点类型就会触发该报错,函数中try...except捕获了该异常,碰到空值直接返回None,因此不会报错。
另外补充:你最早写的测试代码多了一层无效嵌套循环,for elements in df['crew'][0]拿到的elements已经是字典,额外加for dicts in elements会遍历字典的键(字符串类型),正常情况下会触发字符串无法用['job']索引的报错,你之前运行正常大概率是示例代码写反了循环层级。
疑问2 单独测试函数时报字符串索引错误的原因
该函数的入参要求是包含crew字段的单行Series对象,你单独测试时传入的是单个crew字段值(也就是字典列表本身):
- 列表类型只支持整数索引,你在列表上执行
dataframe['crew']相当于用字符串'crew'去索引列表,自然会触发「要求使用整数索引而非字符串索引」的报错。 - 如果要单独测试该函数,需要传入单行数据:
get_directors(df.iloc[0])而非直接传入df['crew'][0]。
内容的提问来源于stack exchange,提问作者coder_hp
相关产品推荐
相关产品推荐

