【问题标题】:(1)TypeError: cannot concatenate object of type '<class 'collections.OrderedDict'>'; only Series and DataFrame objs are valid (2)(1)TypeError: 无法连接类型为 '<class 'collections.OrderedDict'>' 的对象;只有 Series 和 DataFrame obj 有效 (2)
【发布时间】:2019-10-22 14:15:57
【问题描述】:

我创建了一些简单的代码,将所有 Excel 文件复制并粘贴到具有相同格式和列名的同一文件夹中的目录中......

Excel 文件是 .xlsx 类型,因为该文件包含 3 张工作表,所以现在我有 3 张名为 GSM、UMTS 和 LTE 的工作表,并且此工作表名称在所有工作表中都是相同的名称。现在,我只需将 GSM 表中的数据、UMTS 中​​的数据和 LTE 中的数据复制到新表中的每个自己的数据中,然后删除重复项.....

因为我还需要更改列的颜色或保持与源代码和文本样式等相同的样式...

这是我的代码:

import pandas as pd
import os

basepath = r'C:\Users\mwx825326\PycharmProjects\MyExcelCombine\myCDD Combine'
files = list(filter(lambda x: '.xlsx' in x, os.listdir(basepath)))
alldf = pd.DataFrame()
for f in files:
    df= pd.read_excel(f"{basepath}/{f}",encoding='latin-1', sheet_name=None)
    alldf = pd.concat([alldf,df]).drop_duplicates(keep=False)

alldf.to_excel("1- CDD Total12.xlsx")

这是我的错误

Traceback (most recent call last):
  File "C:/Users/mwx825326/PycharmProjects/MyExcelCombine/CombineTool.py", line 9, in <module>
    alldf = pd.concat([alldf,df]).drop_duplicates(keep=False)
  File "C:\Users\mwx825326\PycharmProjects\MyExcelCombine\venv\lib\site-packages\pandas\core\reshape\concat.py", line 255, in concat
    sort=sort,
  File "C:\Users\mwx825326\PycharmProjects\MyExcelCombine\venv\lib\site-packages\pandas\core\reshape\concat.py", line 332, in __init__
    raise TypeError(msg)
TypeError: cannot concatenate object of type '<class 'collections.OrderedDict'>'; only Series and DataFrame objs are valid

Process finished with exit code 1

这是我的床单的样子

mydir = (os.getcwd()).replace('\\', '/') + '/'

gsm_cdd_total = pd.read_excel(r'' + mydir + '1- CDD Total.xlsx' ,sheet_name='GSM')
umts_cdd_total = pd.read_excel(r'' + mydir + '1- CDD Total.xlsx' ,sheet_name='UMTS')
lte_cdd_total = pd.read_excel(r'' + mydir + '1- CDD Total.xlsx' ,sheet_name='LTE')

gsm_generate = pd.read_excel(r'' + mydir + 'GUL CDD20191008021501.xlsx' ,sheet_name='GSM')
umts_generate = pd.read_excel(r'' + mydir + 'GUL CDD20191008021501.xlsx' ,sheet_name='UMTS')
lte_generate = pd.read_excel(r'' + mydir + 'GUL CDD20191008021501.xlsx' ,sheet_name='LTE')

这是我的擅长xlsx 看起来它有三个主要工作表曾经工作表有它自己的数据xlsx looks like

那么,如果有人知道如何更新与每张工作表相关的数据以及如何解决这个问题?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    当您使用 sheet_name=None 运行 read_excel 时,结果是一个字典sheet_nameDataFrame)。

    所以:

    • 不要在此处使用 df 作为目标变量(这是误导),
    • 添加另一个循环遍历键/数据帧(使用 items) 或单独的数据帧(使用),
    • 在这个循环中,您可以合并每个 DataFrame(从当前 床单) alldf

    类似:

    for f in files:
        # Here the result is a dictionary of DataFrames
        dct = pd.read_excel(f"{basepath}/{f}",encoding='latin-1', sheet_name=None)
        # Process each DataFrame from this dictionary
        for df in dct.values()
            alldf = pd.concat([alldf,df]).drop_duplicates(keep=False)
    

    另一种可能性:如果您的每个 Excel 文件只有一个单个 要读取的表格,您可以运行您的原始代码,但没有 sheet_name 参数(其默认值为0,意思是 只从第一张表中读取并返回一个 DataFrame)。

    【讨论】:

    • 首先非常感谢您的支持,您的意思是为每张纸创建一个Dataframe,然后在这张纸上循环?.....我很高兴给我一些具体的例子,如果你可以 :) 我所需要的,我有多个具有相同内容和相同列的 excel 文件,从这个 excel 文件中,有一个主 excel 文件包含相同的数据外观,另一个 excel 文件也具有相同的外观,但具有新数据,所以我想将所有这些新数据文件连接到主文件
    • 感谢您的帮助,但您的代码意味着将所有工作表合并到一张工作表中,这并不是我的意思,我只需要...我有三个不同的工作表 GSM,@987654324 @, and LTE 所以现在每张表都有自己的数据,我想合并这个数据是指每张表的数据,例如,表GSM中的数据应该在GSM中,UMTS中的数据应该在UMTS中,LTE中的数据应该在LTE中:)
    • 所以我看到传递 sheet_name=None (就像你做的那样)是错误的,因为然后 所有 工作表都是一次性处理的。可能您应该编写 3 个单独的循环,计算每个电话系统的结果,传递各自的工作表名称。
    猜你喜欢
    • 2021-10-04
    • 2021-12-11
    • 2022-01-21
    • 2020-05-17
    • 2020-11-05
    • 2020-08-17
    • 1970-01-01
    • 2021-10-23
    • 2019-05-08
    相关资源
    最近更新 更多