筛选给定数值阈值的另一对列对

时间:2019-05-21 19:55:57

标签: python pandas

我有一个下面的DataFrame,其中我需要通过从第三列中选择具有最高数值的一对来过滤来自两个不同列的给定ID对的行。

import pandas as pd

data = [
    ['11x', '12x', 5.5, 'other_1'], 
    ['11x', '12x', 3.5, 'other_2'],
    ['10x', '9x', 1.5, 'other_1'],
    ['10x', '9x', 3.5, 'other_2'],
    ['1x', '1x', 3.5, 'other_x'],
]

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['id1', 'id2', 'to_filter_on', 'other_data']) 

df.head()


# output of head
"""
    id1     id2     to_filter_on    other_data
0   11x     12x     5.5     other_1
1   11x     12x     3.5     other_2
2   10x     9x      1.5     other_1
3   10x     9x      3.5     other_2
4   1x      2x      3.5     other_x
"""

给出一对ID字段(id1和id2),我只想选择to_filter_on列中阈值最高的一对。从某种意义上说,我需要一个上面给出的DataFrame:

"""
    id1     id2     to_filter_on    other_data
0   11x     12x     5.5     other_1
1   10x     9x      3.5     other_2
2   1x      2x      3.5     other_x
"""

请注意,to_filter_on中ID值较低的ID对“ 11x和12x”已删除,与“ 10x和9x”对相同。

感谢任何指针和帮助。

2 个答案:

答案 0 :(得分:3)

使用groupbyidxmax来获取最高“ to_filter_on”值的索引,然后使用它来索引df

df.iloc[df.groupby(['id1', 'id2'], sort=False)['to_filter_on'].idxmax()]

   id1  id2  to_filter_on other_data
0  11x  12x           5.5    other_1
3  10x   9x           3.5    other_2
4   1x   1x           3.5    other_x

或者,通过对重复项进行排序和删除来避免使用groupby

(df.sort_values(['id1', 'id2', 'to_filter_on'])
   .drop_duplicates(['id1', 'id2'], keep='last')
   .sort_index())

   id1  id2  to_filter_on other_data
0  11x  12x           5.5    other_1
3  10x   9x           3.5    other_2
4   1x   1x           3.5    other_x

答案 1 :(得分:1)

如果您要保留所有行,它们具有相同的{max)值to_filter_on

s = df.groupby(['id1','id2'])['to_filter_on'].transform('max')
df[df.to_filter_on.eq(s)]

给予:

    id1     id2     to_filter_on    other_data
0   11x     12x     5.5             other_1
3   10x     9x      3.5             other_2
4   1x      1x      3.5             other_x