【问题标题】:Python filter row with multiple columns conditions具有多列条件的 Python 过滤行
【发布时间】:2022-01-19 06:45:40
【问题描述】:

我有一个 CSV 数据集,我需要使用条件对其进行过滤,但问题是条件可能持续多天。我想要的是保留此条件的最后一个真实值。

我的数据集是这样的

Date           City        Summary       FlightNo.   Terminal     Company
2-18-2019       NY        Airplane Land      23          7         Delta 
2-18-2019     London     Cargo handling      4           5         British
2-18-2019      Dubai     Airplane land       92          7         Emirates
2-19-2019      Dubai     Airplane stay       92          5         Emirates
2-19-2019      Paris     Flight cancel       78          2         British
2-19-2019     London     Airplane Land       4           5         British
2-19-2019       LA       Airplane Land       7           2         United
2-20-2019      Dubai     Airplane land       92          3         Emirates
2-20-2019       LA       Airplane land       29          3         Delta
2-20-2019       NY       Airplane left       23          1         Delta
2-21-2019      Paris     Airplane reschedu   78          2         British
2-21-2019      London    Airplane land       4           3         British
2-21-2019       LA    Airplane from NY land  29          5         Delta
~~~
3-10-2019      London    Airplane land       5           5         KLM
3-10-2019      Paris     Airplane Land       78          7         AirFrance
3-10-2019       LA       Reschedule          29          4         United
3-11-2019       NY       Cargo handled       23          7         Delta
3-11-2019      Dubai     Arrived be4 2 day   34          7         Etihad
~~~
3-21-2019      Dubai      Airplane land      92          5         Emirates
3-21-2019     New Delhi   Reschedule         9           4         AirAsia
3-21-2019      London     Cargo handling     5           2         Lufthansa
3-22-2019     New Delhi   Airplane Land      9           3         AirAsia
3-22-2019       NY        Reschedule         23          2         United
3-22-2019      Dubai      Airplane land      35          1         Emirates

所以代码应该为我们提供飞机着陆的最后一个条目City == CityFlight No. == Flight NoCompany == Company。如您所见,这种情况可能持续多天。因此,如果所有三个条件都为真并且摘要包含 Airplane Lands,则返回最后一个为真

已编辑 所需的输出应该类似于下面的数据集:

Date           City        Summary       FlightNo.   Terminal     Company
2-18-2019       NY       Airplane Land       23          7         Delta 
2-19-2019       LA       Airplane Land       7           2         United
2-20-2019      Dubai     Airplane land       92          3         Emirates
2-21-2019      London    Airplane Land       4           3         British
2-21-2019       LA    Airplane from NY land  29          5         Delta
~~~
3-10-2019      London    Airplane land       5           5         KLM
3-10-2019      Paris     Airplane Land       78          7         AirFrance
~~~
3-21-2019      Dubai      Airplane land      92          5         Emirates
3-22-2019     New Delhi   Airplane Land      9           3         AirAsia
3-22-2019      Dubai      Airplane land      35          1         Emirates

如上图删除行,所有三列(City、FlightNo.和Company)都应该相同,如果其中任何一个不同,那么这两行都应该保留。

它的逻辑: 条件 1:如果 df[Summary] 包含“Airplane”和“land”,则返回该行 条件 2:来自已过滤的数据集 如果 df[City] == df[City] 和 df[FlightNo.] == df[FlightNo.] 和 df[Company] == df[Company] 在 3 天内为真,则保留其中一个最后一个或第一个。 因此,如果在 18 日和 20 日返回飞机降落在同一城市且由同一公司运营的相同航班号的行,则应仅保留 1 天行。但如果是同一个月的 1 日和 15 日,则保留这两行。

请帮我找到适用所有条件的内容并保留最后一个 True 条目。

编辑:

如果在接下来的 3 天内条件为真,请先保留 输入

print (df)
     Date      City Code      Summary      Flight No.   Company
0   2-18-2019    021        Airplane land      23       Emirates
1   2-18-2019    013        Airplane land      23       Etihad
2   2-19-2019    021        Airplane land      23       Emirates
3   2-19-2019    013        Airplane Land      23       Etihad
4   2-20-2019    021        Airplane land      23       Emirates
5   2-20-2019    055        Airplane land      23       Emirates
6   2-20-2019    013        Airplane land      23       Etihad
7   2-21-2019    021        Airplane land      23       Emirates
8   2-21-2019    013        Airplane land      78       Emirates
9   2-21-2019    055  Airplane from NY land    23       Emirates
10  2-22-2019    021        Airplane land      78       Emirates
11  2-22-2019    013        Airplane Land      78       Emirates
12  2-22-2019    055        Airplane land      78       Emirates
13  2-23-2019    021        Airplane land      78       Etihad

输出:

print (df)
         Date      City Code      Summary      Flight No.   Company
    0   2-18-2019    021        Airplane land      23       Emirates
    1   2-18-2019    013        Airplane land      23       Etihad
    5   2-20-2019    055        Airplane land      23       Emirates
    7   2-21-2019    021        Airplane land      23       Emirates
    8   2-21-2019    013        Airplane land      78       Emirates
    10  2-22-2019    021        Airplane land      78       Emirates
    12  2-22-2019    055        Airplane land      78       Emirates

【问题讨论】:

    标签: python pandas dataframe if-statement filter


    【解决方案1】:

    我认为你需要:

    #convert to datetimes
    df['Date'] = pd.to_datetime(df['Date'])
    
    #sortig by datetimes
    df = df.sort_values(['City Code', 'Flight No.','Company','Date'])
    
    #filter case non sensitive
    df=df[(df.Summary.str.contains('Airplane ') & df.Summary.str.contains('Land', case=False))]
    
    s = df.groupby(['City Code', 'Flight No.','Company'])['Date'].transform('first')
    #get diff by first date per groups
    df['diff'] = df['Date'].sub(s).dt.days.fillna(0)
    #group column each 3 days
    df['g'] = (df['diff'] // 3 )
    #filter 3 days window from first per groups
    df = df[~df.duplicated(['City Code', 'Flight No.','Company','g'])]
    print (df)
             Date City Code        Summary  Flight No.   Company
    0  2019-02-18       021  Airplane land          23  Emirates
    1  2019-02-18       013  Airplane land          23    Etihad
    5  2019-02-20       055  Airplane land          23  Emirates
    7  2019-02-21       021  Airplane land          23  Emirates
    8  2019-02-21       013  Airplane land          78  Emirates
    10 2019-02-22       021  Airplane land          78  Emirates
    12 2019-02-22       055  Airplane land          78  Emirates
    13 2019-02-23       021  Airplane land          78    Etihad
    

    【讨论】:

    • 感谢您的帮助,但我试过了,它过滤了一半我不想要的数据集。 如果 City == City 和 No. == No. 并且摘要包含 Airplane & Land 则将最后一个保留在两天内。 因此,如果条件在 9 日、10 日、11 日和 25 日为真,那么它应该返回第 11 和 25 行。所以我只需要在 3 天内过滤重复的,如果超过,然后保留行
    • @SMO - 现在可以测试了吗?
    • 没有城市代码每天只能出现一次
    • 差异可能不止一天。所以城市代码可以每天、隔天甚至一年出现一次
    • 这个有效。然而,包含def f(x): return (x.diff().dt.days.fillna(0).cumsum() // 3).duplicated() 的前一个也有效。这对我来说更有意义。非常感谢您的时间和精力。
    猜你喜欢
    • 2016-11-16
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2020-08-20
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多