Pandas使用concat拼接列表存储的DataFrame时报TypeError求解
报错根因
你遇到的类型错误核心原因是:alldfs列表里存储的是字符串类型的变量名,不是实际的DataFrame对象。
你直接写pd.concat((['result_14', 'result_12']), ignore_index=True)能运行成功,是因为代码里直接写的result_14、result_12是你当前环境中已经定义好的DataFrame变量,Python会直接识别为对应的DataFrame对象;但你把这两个名字加引号存到alldfs里时,列表里存的只是纯文本,pd.concat无法拼接字符串,自然会抛出only Series and DataFrame objs are valid的错误。
正确实现方式
根据你的代码逻辑,可以选以下两种方案:
方案1:直接存储DataFrame对象到列表(优先推荐,稳定性最高)
动态筛选、生成DataFrame的环节,不要存变量名的字符串,直接把DataFrame对象本身加入列表即可:
alldfs = [] # 循环/逻辑分支中拿到对应DataFrame后,直接追加对象 for idx in [12, 14]: # 替换成你实际生成/筛选result_12、result_14的逻辑 current_df = 生成对应DataFrame的代码 alldfs.append(current_df) # 直接传入列表拼接即可,不需要额外套一层元组 merged_df = pd.concat(alldfs, ignore_index=True)
方案2:从运行环境中按变量名字符串取对应对象
如果你的代码逻辑只能先拿到变量名的字符串列表,可以通过全局/局部变量字典取出对应的实际DataFrame对象:
alldfs = ['result_14', 'result_12'] # 如果变量是全局定义的用globals(),函数内局部变量用locals() df_objects = [globals()[df_name] for df_name in alldfs] merged_df = pd.concat(df_objects, ignore_index=True)
提示:
pd.concat第一个参数本身就接收可迭代的Series/DataFrame对象,不需要额外给列表套一层元组,直接传列表即可。
内容的提问来源于stack exchange,提问作者SMar3552
相关产品推荐
相关产品推荐

