导入多个CSV文件时,过滤要由顶部单元格导入的行

时间:2019-04-15 18:26:02

标签: python python-3.x pandas dataframe

我想导入大量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之后)

结果将是我有一个数据框,其中的日期行为几天,但没有更多重复项。

1 个答案:

答案 0 :(得分:0)

为什么不创建一个解析每个文件的函数?下面是一种从文件顶部获取日期,然后过滤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