【问题标题】:Balancing operation data in DataFrame在 DataFrame 中平衡操作数据
【发布时间】:2017-12-29 06:20:45
【问题描述】:

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

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

数据样本。这是较大的全国运营数据的子集,并针对发生在机场 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”只是一个占位符,因为如果平衡到达,我们不知道它们来自哪里,而平衡离开时我们不知道它们去了哪里。

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

【问题讨论】:

  • 我还是不明白,您的样本数据的预期输出是什么?你能在你的问题中添加这样的预期输出吗?
  • 那个^。请添加您的预期输出,并简化您的解释!
  • 我为两架飞机添加了一些示例平衡数据。 @CedricZoppolo
  • 我们如何知道在 AMF1964 的到达和 AMF1965 的出发时使用“BAL”?该值未显示在以前的数据中。
  • @Parfait 它只是一个占位符,因为在平衡到达时我们不知道它们来自哪里,反之亦然平衡离开。我会澄清的

标签: python pandas dataframe


【解决方案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

这些是需要平衡的航班-机场组合。

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

【讨论】:

  • 谢谢,这是一个很好的开始!我会在我的代码中看看我能做些什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2016-12-31
  • 2020-06-07
相关资源
最近更新 更多