如何提取在子集的子集中具有最大行值的数据帧的子集?

How to extract subset of a dataframe that has the largest maximum row value within a subset of a subset?

我有一个数据框 (df),其中包含沿河流的数据点,其中每个流域 (Basin ID) 包含多条河流 (River ID),并且每条河流沿其长度 (Length) 都有点。它看起来像这样(简化):

Basin_ID River_ID Length
1 1 5
1 1 10
1 2 5
1 2 7
1 2 12
1 3 5
2 1 5
2 1 10
2 1 12
2 1 14
2 2 5

在此示例中,流域 1 有 3 条河流,流域 2 有两条河流。实际 table 有 600K 行和 12 列其他河流数据。

Objective: 我想为 df 中的每个独特流域提取单个最长的河流子集,这样我最终得到这样的结果:

Basin_ID River_ID Length
1 2 5
1 2 7
1 2 12
2 1 5
2 1 10
2 1 12
2 1 14

我假设我需要做类似

的事情
res = df.groupby('Basin_ID').apply(lambda x: ...

但是因为我需要同时按 Basin_ID 和 River_ID 进行分组,所以我发现很难想出一个可以正常工作的表达式。 欢迎任何建议,谢谢!

df2=df.assign(maxRiverLength=df.groupby('Basin_ID').transform(lambda x: x.max())['Length']).set_index(['Basin_ID','River_ID'])
df.set_index(['Basin_ID','River_ID']).loc[df2[df2['Length']==df2['maxRiverLength']].index].reset_index()

可能有更聪明的方法,但我分两步重现了您的输出:

  • 我首先创建一个包含每个 Basin_ID 的 maxRiverLength 的新列,并将其分配给 df2,在其中我将索引设置为 Basin_ID 和 River_ID:

  • 然后我取原来的df,把index也设为Basin_ID和River_ID 并按 'Length' = 'maxRiverLength'

    的 df2 索引过滤