【问题标题】:Pandas - First find header, then only load certain columns on an Excel sheetPandas - 首先查找标题,然后仅在 Excel 工作表上加载某些列
【发布时间】:2019-07-08 15:47:03
【问题描述】:

我正在尝试使用 Pandas 读取多个大型 Excel 文件并将它们组合成一个 CSV,并且只需要每个文件的一个数据表中的数据。

在此数据表中,有许多我不需要数据的填充行 - 基本上,我需要的数据从每个文件的不同位置开始。我需要的数据的第一列称为Row Labels

有没有办法让 Pandas 将数据拉到以 Row Labels 为标题的列下方以及该列右侧的四列?

现在,这是我一直试图无济于事的:

for f in glob.glob("../Test/Drawsheet*.xlsx"):
    df_temp = pd.ExcelFile(f)
    if 'PVT' in df_temp.sheet_names:
        df = pd.read_excel(df_temp, 'PVT', index_col=None, usecols='Row Labels')
        #df.to_csv('your_csv.csv', encoding='utf-8')
        #df = df_temp.parse('PVT')
        all_data = all_data.append(df, ignore_index=True, sort=True)

【问题讨论】:

  • 读入标题,找出列的位置,然后用usecols指定你需要的5个索引读入文件。
  • 因此每个文件的列都不同。例如,有时它可能从 G 列开始,而其他时候则从 H 列开始。
  • 这就是为什么您只读取一行 (nrows=1)(非常快)然后读取 idx = df.columns.get_loc('Row Labels'),然后您读取指定 usecols=[*range(idx, idx+5)] 的整个文件
  • 如果行从第 10 行而不是第 1 行开始,知道如何执行此操作吗?
  • 添加 skiprows=10 或添加多少行,需要多少行。

标签: python excel pandas csv


【解决方案1】:

你可以告诉 Pandas 只加载第一行 20 (假设你的标题在那里)。然后,您可以找到 Row Labels 值,然后使用此位置加载整个 Excel 文件。例如:

import pandas as pd

filename = 'input.xlsx'
sheet = 'Sheet1'

df = pd.read_excel(filename, sheet, nrows=20)
header_loc = df[df == 'Row Labels'].dropna(axis=1, how='all').dropna(how='all')
row = header_loc.index.item()
column = header_loc.columns.item()
df = pd.read_excel(filename, sheet, skiprows=row+1, usecols=list(range(column, column+5)))

如果您有 CSV,则可以使用以下方法。它读取文件的每一行并尝试在解析的行中定位Row Labels。这将失败,直到到达实际的标题行。当它这样做时,列索引用于在其右侧选择所需的列。 skiprows 参数用于告诉 pandas 跳到文件中正确的标题行,usecols 可以正确指定接下来的 4 个列名。

import pandas as pd
import csv

filename = 'input.csv'

with open(filename, newline='') as f_csv:
    for row_number, row in enumerate(csv.reader(f_csv)):
        try:
            col = row.index('Row Labels')
            break
        except ValueError:
            continue

df = pd.read_csv(filename, skiprows=row_number, usecols=row[col:col+4])
print(df)

【讨论】:

  • 这会转化为 .xlsx 吗?我还没有它们在 .csv
  • 是的,我已经更新了答案。可以让 Pandas 只加载第一行并定位标题。然后可以使用它加载整个文件。
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2016-09-26
相关资源
最近更新 更多