我有一个下面的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”对相同。
感谢任何指针和帮助。
答案 0 :(得分:3)
使用groupby
和idxmax
来获取最高“ 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