【问题标题】:When importing multiple CSV files, filter rows to be imported by top cell导入多个 CSV 文件时,按顶部单元格过滤要导入的行
【发布时间】:2019-09-05 19:00:09
【问题描述】:

我想导入大量包含多天数据的 CSV 文件。

这是一个示例数据,前五行:

PostDaily;07.04.2019
Leg Number;Aircraft Manufacturer;Aircraft Type;Day Of Origin;AC Logical Number;Airline Designator;Flight Number;Flight Number Suffix;Tail Sign;Scheduled Departure Airport;Scheduled Arrival Airport;Scheduled Departure DateTime;Scheduled Arrival DateTime;Offset DA;Offset AA;Actual Departure Airport;Actual Arrival Airport;Actual Departure DateTime;Actual Arrival DateTime;Flight Type;Pax Booked;Pax Flown;Crew;Leg State;Meals;Best;Biz
27507094;Other;73H;06.04.2019;29;WW;0584; ;-GABAF-;GGN;PMI;06.04.2019 02:35;06.04.2019 05:00;+02:00;+02:00;CGN;PMI;06.04.2019 02:40;06.04.2019 04:52;J;129;123;X3.../X3...//X3TUI;ARR;41;0;0
27507179;Other;73H;06.04.2019;29;WW;0585; ;-GABAF-;PMI;GGN;06.04.2019 05:45;06.04.2019 08:05;+02:00;+02:00;PMI;CGN;06.04.2019 05:44;06.04.2019 07:48;J;41;40;X3.../X3...//X3TUI;ARR;29;0;0
27506541;Other;73H;06.04.2019;29;WW;0526; ;-GABAF-;GGN;BCN;06.04.2019 09:30;06.04.2019 11:50;+02:00;+02:00;CGN;BCN;06.04.2019 09:44;06.04.2019 11:47;J;183;174;X3.../X3...//X3TUI;ARR;50;0;0

不幸的是,数据重叠,我需要修改我现有的导入代码,以便 python 只导入在“原始日期”列中具有相同值的行作为第一行(这也需要在结尾)。此外,导入脚本需要在 Mac 和 Windows 上运行。

这是我用来导入 CSV 文件的代码。它工作得很好,直到我意识到 CSV 文件中有重复项(不是 100% 重复,因为某些行具有不同的值)。

sector_ytd = pd.concat([pd.read_csv(f, delimiter=";", skiprows=1) for f in sector_folder.glob('4UDailyPos*.csv')], ignore_index = True)

每个 CSV 文件的第一行包含以下数据:

PostDaily;07.04.2019

现在我只想导入或连接我的 CSV 文件的行,其中 Date of Origin 列等于第一行中的日期(PostDaily 之后;)

结果是我有一个数据框,其中包含几天的日期行,但不再有重复项。

【问题讨论】:

  • 日期是mm.dd.yyyy 还是dd.mm.yyyy 格式?

标签: python python-3.x pandas dataframe


【解决方案1】:

为什么不创建一个函数来解析每个文件?下面是一种从文件顶部获取日期然后过滤 DataFrame 以仅返回与日期匹配的行的方法。

import pandas as pd
import csv

def parse_file(file):

    # Grab the first line of the file
    with open(file, 'r') as f:
        first_line = f.readline()

    # Parse the date out from the first line
    day = first_line.split(';')[1].strip()

    # Go ahead and read in the entire csv file
    df = pd.read_csv(file, sep=';', header=1)

    # Return the data from just that one day
    return df.loc[df['Day Of Origin'] == day]


df = parse_file('log.csv')
print(df[['Leg Number', 'Aircraft Type', 'Day Of Origin']])

#    Leg Number Aircraft Type Day Of Origin
# 1    27507179           73H    07.04.2019
# 2    27506541           73H    07.04.2019
# 3    27507179           73H    07.04.2019
# 4    27506541           73H    07.04.2019

然后循环遍历它们,只需使用您的 concat 方法

sector_ytd = pd.concat(
    # Pass your filename to the function rather going straight to pd.read_csv()
    [parse_file(f) for f in sector_folder.glob('4UDailyPos*.csv')],
    ignore_index = True)

为了向您展示函数过滤器,这是我使用的 csv 文件。它对您发布的内容进行了一些修改,因此它包含有效和无效的行。

PostDaily;07.04.2019
Leg Number;Aircraft Manufacturer;Aircraft Type;Day Of Origin;AC Logical Number;Airline Designator;Flight Number;Flight Number Suffix;Tail Sign;Scheduled Departure Airport;Scheduled Arrival Airport;Scheduled Departure DateTime;Scheduled Arrival DateTime;Offset DA;Offset AA;Actual Departure Airport;Actual Arrival Airport;Actual Departure DateTime;Actual Arrival DateTime;Flight Type;Pax Booked;Pax Flown;Crew;Leg State;Meals;Best;Biz
27507094;Other;73H;06.04.2019;29;EW;0584; ;-GABAF-;GGN;PMI;06.04.2019 02:35;06.04.2019 05:00;+02:00;+02:00;CGN;PMI;06.04.2019 02:40;06.04.2019 04:52;J;129;123;X3.../X3...//X3TUI;ARR;41;0;0
27507179;Other;73H;07.04.2019;29;EW;0585; ;-GABAF-;PMI;GGN;06.04.2019 05:45;06.04.2019 08:05;+02:00;+02:00;PMI;CGN;06.04.2019 05:44;06.04.2019 07:48;J;41;40;X3.../X3...//X3TUI;ARR;29;0;0
27506541;Other;73H;07.04.2019;29;EW;0526; ;-GABAF-;GGN;BCN;06.04.2019 09:30;06.04.2019 11:50;+02:00;+02:00;CGN;BCN;06.04.2019 09:44;06.04.2019 11:47;J;183;174;X3.../X3...//X3TUI;ARR;50;0;0
27507179;Other;73H;07.04.2019;29;EW;0585; ;-GABAF-;PMI;GGN;06.04.2019 05:45;06.04.2019 08:05;+02:00;+02:00;PMI;CGN;06.04.2019 05:44;06.04.2019 07:48;J;41;40;X3.../X3...//X3TUI;ARR;29;0;0
27506541;Other;73H;07.04.2019;29;EW;0526; ;-GABAF-;GGN;BCN;06.04.2019 09:30;06.04.2019 11:50;+02:00;+02:00;CGN;BCN;06.04.2019 09:44;06.04.2019 11:47;J;183;174;X3.../X3...//X3TUI;ARR;50;0;0

【讨论】:

  • 感谢您的帮助。使用这种方法,我必须指定我导入的每个文件的名称,对吗?我正在尝试避免这种情况,因为我正在导入大量文件,并且我目前将它们全部保存在一个文件夹“sector_folder”中
  • 您必须将每个文件发送到函数,就像您在列表理解中将其发送到 pd.read_csv() 一样。所以你只需要像我展示的那样稍微修改一下列表理解。当然,由于我并不真正了解文件中的数据结构,因此您仍然需要对函数进行一些调整,但这应该有助于您实现目标。
  • 抱歉,我很困惑,因为我从未使用过解析。有没有什么办法可以让它与我现有的代码一起工作,只需稍微调整一下。
  • 当我使用你的代码时,我得到“IndexError: list index out of range”
  • 您能否将输出文件的前几行粘贴到您的问题中?我假设您遇到该错误的行是day = first_line.split(',')[1] 您可能需要将逗号更改为分号。我刚刚创建了一个模拟 csv 文件,所以我可以测试我的功能。我包含了我的 csv 的内容,这样您就可以看到我使用的内容与您在实际文件中拥有的内容之间的差异,以便进行必要的调整。
猜你喜欢
  • 2013-03-31
  • 2021-05-15
  • 2020-08-13
  • 2021-09-18
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2018-11-22
相关资源
最近更新 更多