Pandas DataFrame根据映射为列表列生成新列及报错解决
报错原因
你触发TypeError: 'Series' object is not callable的核心问题是:Python内置map()函数的第一个参数必须是可调用对象(函数、实现了__call__方法的对象),你传入的df2.set_index('Site')['cells']是Pandas Series类型,本身不可被调用,因此直接传给map()时会报错。
另外你原写法每次执行lambda都会重新给df2做一次set_index,重复计算拉低性能,完全没必要。
正确实现代码
先提前构建站点和cells值的映射字典,仅需计算一次,性能更高:
# 构建Site到cells的键值对映射 site_cell_map = df2.set_index('Site')['cells'].to_dict() # 逐行遍历Sites列的列表,匹配对应cells值生成新列 df1['Cells'] = df1['Sites'].apply(lambda site_list: [site_cell_map[s] for s in site_list])
执行后得到的结果完全匹配预期:
Sites Cells 0 ['a'] [2] 1 ['b', 'c', 'a', 'd'] [4, 3, 2, 5] 2 ['c'] [3]
补充说明
如果一定要用内置map()写法,需要把取值逻辑写成可调用的lambda函数,但是可读性和执行效率都不如上面的列表推导式写法,不推荐:
df1['Cells'] = df1['Sites'].apply(lambda x: list(map(lambda s: site_cell_map[s], x)))
内容的提问来源于stack exchange,提问作者Mahdi Abadinia
相关产品推荐
相关产品推荐

