对DataFrame列表应用函数报错:string indices must be integers, not str
问题根源与解决方案
兄弟,你的报错原因很明确——你传给map的是字符串列表,而不是实际的DataFrame对象列表,另外还有Python3里map返回迭代器的小坑,我给你一步步理清楚:
1. 核心错误:把变量名字符串当成了DataFrame对象
看你最后两行代码:
dfs = ['df1','df2','df3'] map(calc2,dfs)
这里的dfs是三个字符串,代表你的DataFrame变量名,但map只会把这些字符串本身传给calc2函数,而不是对应的DataFrame对象。所以当calc2里执行data['center']时,data是字符串(比如'df1'),字符串的索引只能是整数(比如'df1'[0]取第一个字符),用'center'当索引自然就抛出TypeError: string indices must be integers, not str了。
2. 次要问题:Python3的map返回迭代器,不会自动执行
另外,Python3中map()返回的是一个惰性迭代器,如果你只是写map(calc2,dfs),函数根本不会实际运行,必须遍历它或者转成列表才能触发执行。
3. 额外小坑:map结果不能直接下标访问
你的calc2函数里有一行:
key = map(naming,key) dc, dt, ct = key[0], key[1], key[2]
Python3里map返回的迭代器不支持下标访问(比如key[0]),必须先转成列表,否则会抛出TypeError: 'map' object is not subscriptable。
修正后的完整代码
def calc2(data): def naming(x_array): ww = ' '.join(str(n) for n in x_array) return ww dc = data['center'].unique() dt = data['dt'].unique() ct = data['Cust Type'].unique() key = [dc, dt, ct] key = list(map(naming, key)) # 转成列表才能下标访问 dc, dt, ct = key[0], key[1], key[2] date = data['date'] print(dc, dt, ct, date) # 注意:这里直接用DataFrame变量,不是字符串 dfs = [df1, df2, df3] # 转成列表触发map执行 list(map(calc2, dfs))
关键修正点总结
- 把
dfs = ['df1','df2','df3']改成dfs = [df1, df2, df3]:直接引用实际的DataFrame对象,而不是变量名字符串。 - 把
map(calc2,dfs)改成list(map(calc2,dfs)):触发迭代器执行,让calc2真正作用在每个DataFrame上。 - 把
key = map(naming,key)改成key = list(map(naming, key)):将迭代器转成列表,支持下标访问。
这样修改后,你的代码就能正常批量处理DataFrame列表了~
内容的提问来源于stack exchange,提问作者harold_noobie
相关产品推荐
相关产品推荐

