基于多种条件过滤 Pandas 数据集

时间:2021-06-30 19:32:00

标签: python pandas dataframe

我正在使用这个数据框:

  Callsign  Distance    AirportSize
0   HVN19   3.727263    2
1   HVN19   3.727263    1
2   HVN19   11.485452   2
3   CCA839  2.094717    2
4   CCA839  2.094717    1
5   CCA839  6.622537    2
6   CES219  1.751279    1
7   CES219  5.436940    4
8   CES219  6.950773    4
9   ETH704  2.976954    4
10  ETH704  3.844980    4
11  ETH704  5.452634    4

我正在尝试将 CallsignAirportSize 的最小值联系起来,仅当机场之间具有相同Callsign< 的距离< /strong> 小于 1。此外,我只想保留这些行并将其他行放在同一个 Callsign 中。

我将举例说明同一个呼号HVN19)中的前三行,以便更清楚:我们可以立即删除第三行,因为距离第三行和前两行之间的差异(11.485452 - 3.727263 > 1)。对于剩下的两行,我们选择第二行,因为 AirportSize 比第一行小 (1 < 2)。

结果应该是这样的:

  Callsign  Distance    AirportSize

1   HVN19   3.727263    1
2   CCA839  2.094717    1
3   CES219  1.751279    1
4   ETH704  2.976954    4

1 个答案:

答案 0 :(得分:0)

根据评论中明确的要求,这是一个可行的解决方案,可以运行并返回预期结果。

它也应该非常有效。

import pandas as pd
import io

df_txt = """
Id  Calls   Distance  AirportSize
0   HVN19   3.727263    2
1   HVN19   3.727263    1
2   HVN19   11.485452   2
3   CCA839  2.094717    2
4   CCA839  2.094717    1
5   CCA839  6.622537    2
6   CES219  1.751279    1
7   CES219  5.436940    4
8   CES219  6.950773    4
9   ETH704  2.976954    4
10  ETH704  3.844980    4
11  ETH704  5.452634    4
"""
    
df1 = pd.read_fwf(io.StringIO(df_txt)).set_index('Id').rename(columns = {'Calls':'Callsign'})


# Need to sort or to ensure following will always work
df1.sort_values(['Callsign','Distance'])
# calc distance between each subsequent ap - fillna as 0 for closest ap
df1['dist_diff'] = df1.groupby('Callsign')['Distance'].diff().fillna(0)
df1['dist_diff'] = df1.groupby('Callsign')['dist_diff'].cumsum()

# Keep only smallest qualifiying airport for each callsign, tiebreak with Distance
df1[df1['dist_diff']<1].sort_values(['Callsign','AirportSize','Distance']).drop_duplicates('Callsign').drop('dist_diff',axis=1)

输出

    Callsign    Distance    AirportSize
Id          
4   CCA839  2.094717    1
6   CES219  1.751279    1
9   ETH704  2.976954    4
1   HVN19   3.727263    1