我正在使用这个数据框:
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
我正在尝试将 Callsign 与 AirportSize 的最小值联系起来,仅当机场之间具有相同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
答案 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