You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:13:58