我有一个数据框(df),其中包含沿河流的数据点,其中每个流域(流域 ID)包含多条河流(河流 ID),并且每条河流沿其长度(长度)都有点。它看起来像这样(简化):
Basin_ID | River_ID | 长度 |
---|---|---|
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 有两条河流。实际表有 600K 行和 12 列其他河流数据。
目标:我想为 df 中的每个独特流域提取单个最长的河流子集,以便最终得到如下结果:
Basin_ID | River_ID | 长度 |
---|---|---|
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 的新列,并将其分配给我将索引设置为 Basin_ID 和 River_ID 的 df2:
然后,我采用原始 df,将索引也设置为 Basin_ID 和 River_ID,并通过具有“Length”=“maxRiverLength”的 df2 的索引进行过滤
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句