【问题标题】:Extract data from specific columns with the same name in multiple Excel files and sheets [closed]从多个 Excel 文件和工作表中具有相同名称的特定列中提取数据 [关闭]
【发布时间】:2020-02-25 06:08:01
【问题描述】:

我有 20 个文件夹,每个文件夹中有不同数量的 excel(如 .xlsx)文件。每个 excel 文件都有不同数量的工作表,工作表在第一行有不同的列数和不同的列名。第二行有列名,其通用名称为“数字”(如下面的 excel 屏幕截图所示)。 我需要从每个工作表、每个 excel、每个文件夹中的名称为“数字”的特定列中提取唯一值,然后汇总到具有由此收集的唯一值的列。

因为我不是 excel 方面的专家,所以我只用下面的代码尝试了一个 excel。

import os
import pandas as pd

workbook = r'C:\Users\Material.xlsx'
df = pd.concat(pd.read_excel(workbook, sheet_name = None , usecols = ['Number'], header = 1))
df = df.Number.unique()
df


我在这里遇到过这个问题:

  1. 此脚本从 Excel 中读取所有工作表,但如果存在不同数量的同名列,则它仅读取第一列。这不应该是这样。 EX:我应该得到一个唯一列,其中包含“数字”列中的所有唯一值,如下面屏幕截图中的“Sheet1”所示。
  2. 它返回一个数组,我想要一个 df。

也试过这个代码:

import os
import pandas as pd
folder_path = os.chdir(r'C:\Users\Material.xlsx')
files = os.listdir(folder_path)
print(files)
df2 = pd.DataFrame()
for i in range (len(files)):
    df = pd.read_excel(files[i], header=1)
    df1 = df.filter(regex='Number')
    df2 = pd.concat([df2, df1], axis=1, sort=False)
    i = i+1
df2 = df2.filter(regex='Number')
df2
df2.to_excel(r"r'C:\Users\output.xlsx', index = False)

这里的问题是:

  1. 如果有许多同名的列,我只会得到第一列的值。
  2. 只取单个工作表,不考虑 Excel 中的其他工作表。

请帮忙

【问题讨论】:

  • 为什么不将它们保留为有序的字典,由 read_excel() 返回?
  • 有序字典很好(我在那里有我的数据),但我最终希望它在一个单独的 df 中,我不知道该怎么做/我没有那里的专业知识。跨度>
  • pd.concat([df1,df2,df3, ....], axis=0, ignore_index=True) 将连接具有不同列数的数据帧,并在缺少特定列时添加 nan。

标签: python python-3.x pandas dataframe data-analysis


【解决方案1】:

主要问题是,当基于具有多个同名列的数据创建Dataframe 时,pandas 会重命名以下列并在名称中添加一个数字。 因此,在您的情况下,如果您有多个列,则调用 NUMBER pandas 将重命名它们:NUMBER NUMBER.1 NUMBER.2 等等。 在那里,当您尝试使用 usecols = ['Number'] 调用列时,您只会得到第一列。

可选的解决方案是迭代每一列并检查名称。 以下是针对您的情况的更全面的解决方案:

import os
import pandas as pd

sum_df=pd.DataFrame()
base_path=r'YOUR_PATH'
for fldr in os.listdir(base_path):
    if os.path.isdir(base_path+'/'+fldr):
        curr_dir=base_path+'/'+fldr
        for xls in os.listdir(curr_dir):
            if xls.endswith('.xlsx'):
                dict=pd.read_excel(curr_dir+'/'+xls,sheet_name = None,header = 0)
                for sheet in dict.items():
                    for col in sheet[1].iteritems():
                        if ('NUMBER' == col[0]) or ('NUMBER' in col[0] and '.' in col[0]):
                            sum_df=sum_df.append(pd.DataFrame(data=col[1]._values,columns=['NUMBER']))
sum_df=sum_df.d.unique()
print(sum_df)

【讨论】:

  • 它给出了一个空的df
  • 如您所见,我的解决方案假设标题位于第一行 - header = 0。尝试设置header = 1,使其与您的情况相符。
  • 是的,我当然做到了。
  • 另外,您需要在根文件夹下运行脚本,在该文件夹下有包含.xlsx 文件的子文件夹。否则,您可以通过适当的调整从 for xls in os.listdir(curr_dir): 行开始脚本。
猜你喜欢
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2021-06-23
  • 2017-06-20
相关资源
最近更新 更多