在DataFrame中平衡操作数据

问题描述 投票:2回答:1

我有一个飞机操作的DataFrame。当天气恶劣并且飞机需要使用仪器而不是仅依靠视觉进近/着陆时,仅记录IFR飞行计划(仪表飞行规则)的操作。问题是如果它们在恶劣天气(IFR)中飞行但是在天气好的情况下飞行(VFR,可视飞行规则),VFR操作不会被记录,并且我的操作不平衡。基本上,看起来飞机从未离开过。

我需要平衡这些操作到达到达=离开的地方。我正在努力寻找一种简洁的方法来做到这一点,并希望通过熊猫有一个更简单的方法。

数据样本。这是较大的全国性运营数据的一部分,并针对在机场KHRI发生的运营进行了解析:

Aircraft_ID    Departure_Airport    Arrival_Airport    Departure_Date    Arrival_Date
AMF1965        KLGD                 KHRI               31-Dec-2011       31-Dec-2011
AMF1965        KHRI                 KPDX               31-Dec-2011       31-Dec-2011
N901JE         KHRI                 KS21               01-Jan-2012       01-Jan-2012
N901JE         KS21                 KHRI               02-Jan-2012       02-Jan-2012
AMF1926        KPDX                 KHRI               03-Jan-2012       03-Jan-2012
AMF1964        KPDX                 KHRI               04-Jan-2012       04-Jan-2012
AMF1965        KHRI                 KPDX               04-Jan-2012       04-Jan-2012
AMF1964        KPDX                 KHRI               05-Jan-2012       05-Jan-2012
AMF1964        KHRI                 KLGD               05-Jan-2012       05-Jan-2012



# ADD TO BALANCE 2 DEPARTURES FROM KHRI AND ONLY 1 ARRIVAL FOR AMF1965
AMF1965        BAL                  KHRI               04-Jan-2012       04-Jan-2012  
# ADD TO BALANCE 1 DEPARTURES FROM KHRI AND 2 ARRIVALS FOR AMF1964
AMF1964        KHRI                 BAL                04-Jan-2012       04-Jan-2012

编辑:添加的数据会添加到达以匹配不平衡的离开。对于第一次添加,一对到达/离开对在2012年12月31日匹配,在2012年1月4日离开了一个。我只是假设匹配到达是在同一天。 'BAL'只是一个占位符,因为我们不知道他们来自哪里,如果平衡到达,我们不知道他们在平衡出发时去了哪里。

我基本上需要在这个子集中获得机场的到达次数=出发次数,并在必要时添加虚拟操作,如果飞机有不平衡的到达和离开。我现在或多或少能够通过自定义功能做到这一点,但我无法找到一个好方法来确定虚拟数据是否需要到达或离开以及机场。我只是为没有真实数据的差异创建了一个虚拟条目。

python pandas dataframe
1个回答
1
投票

这并不能完全回答您的问题,但可能会引导您找到解决方案。

以下代码查找飞机 - 机场组合,其中离港数量与到达人数不符。

import pandas as pd
df = pd.read_clipboard()   # I copied the example DF from your question

# For each aircraft, count the number of *departures* from each airport
deps = df.groupby('Aircraft_ID')['Departure_Airport'].value_counts()
# For each aircraft, count the number of *arrivals* at each airport
arrs = df.groupby('Aircraft_ID')['Arrival_Airport'].value_counts()

# Concatenate these Series on their aircraft-airport MultiIndexes.
# pd.concat defaults to outer join, which means that
# if an index value appears in only one Series, the value
# from the other Series is NaN.
counts = pd.concat([deps, arrs], axis=1)
counts.rename(columns={'Departure_Airport': 'dep',
                       'Arrival_Airport': 'arr'}, inplace=True)
counts
              dep  arr
AMF1926 KHRI  NaN  1.0
        KPDX  1.0  NaN
AMF1964 KHRI  1.0  2.0
        KLGD  NaN  1.0
        KPDX  2.0  NaN
AMF1965 KHRI  2.0  1.0
        KLGD  1.0  NaN
        KPDX  NaN  2.0
N901JE  KHRI  1.0  1.0
        KS21  1.0  1.0
filled = counts.fillna(0, inplace=True).astype(int)

# Get all rows where the number of departures does not match
# the number of arrivals
filled[filled['dep'] != filled['arr']]
              dep  arr
AMF1926 KHRI    0    1
        KPDX    1    0
AMF1964 KHRI    1    2
        KLGD    0    1
        KPDX    2    0
AMF1965 KHRI    2    1
        KLGD    1    0
        KPDX    0    2

fillna方法过于激进:它包括零离开或零到达的行。例如,AMF1926只进行了一次飞行(KPDX到KHRI),但它出现在上面的输出中,因为离开KPDX(一个)的次数与KPDX(零)的到达次数不匹配。

修复:删除缺少值的行,而不是用零填充NaN。

dropped = counts.dropna().astype(int)
dropped
              dep  arr
AMF1964 KHRI    1    2
AMF1965 KHRI    2    1
N901JE  KHRI    1    1
        KS21    1    1

unbalanced = dropped[dropped['dep'] != dropped['arr']]
unbalanced
              dep  arr
AMF1964 KHRI    1    2
AMF1965 KHRI    2    1

这些是需要平衡的飞行 - 机场组合。

从中生成占位符行需要更多的工作,但希望这是一个开始。

© www.soinside.com 2019 - 2024. All rights reserved.