在熊猫中使用groupby后,如何获得每个组的第一行?

时间:2018-10-06 22:04:35

标签: python pandas group-by

我有pandas数据框,其中的列为X, Y, Z。我需要为maximum的每个值获取Z中的X,并且还需要保留列Y的对应值。

我尝试了以下代码:

s_pts = inv_trans_df.groupby(['X', 'Y'])['Z'].max()

运行此代码时,我得到的输出是

enter image description here

我希望与此类似:

0.62933 | 0.68162 | 0.27078

0.62938 | 0.68136 | 0.26827

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式为每个X具有最大Z值的行建立索引:

idx = inv_trans_df.groupby(['X'])['Z'].transform(max) == inv_trans_df['Z']

然后,该索引将为您提供给定X的最大Z值的每一行,您可以选择Y或从此处进行任何操作。

inv_trans_df[idx]

请注意,这将保留所有重复项-如果X值的最大Z值出现一次以上,则所有匹配的最大值将出现在结果中。您如何处理此问题取决于您的实际目标。

答案 1 :(得分:0)

您可以按值排序,然后按索引系列的第一个删除重复项:

df = pd.DataFrame({'col1': list('ABAB'*3),
                   'col2': list('XYYX'*3),
                   'col3': list(range(12))})

res = df.sort_values('col3', ascending=False)\
        .drop_duplicates('col1')

print(res)

   col1 col2  col3
11    B    X    11
10    A    Y    10