如何解决在基于多索引的数据帧的内部级别中获取前 N 个值
我有一个 Pandas MultiIndex DataFrame,它是从一个 xarray 数据集转换而来的,该数据集具有 3 个维度,分别是时间、纬度和经度以及两个变量“FFDI”和“REF_ID”)。时间 = 17696,每天从 1972-01-20 到 2020-06-30) 和纬度 (=148) 和经度 (=244)
数据框看起来像:
FFDI REF_ID
latitude longitude time
-39.200001 140.800003 2009-02-07 10.2 0
2009-01-30 10.1 0
1983-02-12 10.0 0
2003-01-13 9.8 0
2019-12-28 9.8 0
2000-01-17 9.7 0
... ... ... ... ...
-33.900002 150.000000 ... ... ... ...
1994-06-16 0.9 36111
1978-07-07 0.2 36111
2020-08-28 0.1 36111
2007-06-09 0.0 36111
1994-07-30 0.0 36111
1987-06-21 0.0 36111
639037952 rows × 2 columns
DataFrame 已经按“FFDI”降序排序。我想要实现的是获得每个纬度和经度的前 N 个(比如 3 个)“时间”行。
所以如果 N = 3,DataFrame 将如下所示:
FFDI REF_ID
latitude longitude time
-39.200001 140.800003 2009-02-07 10.2 0
2009-01-30 10.1 0
1983-02-12 10.0 0
-39.200001 140.83786 2001-01-03 10.5 0
2006-01-18 10.3 0
2009-02-07 10.2 0
... ... ... ... ...
-33.900002 150.000000 2009-02-07 10.9 36111
2006-01-10 10.7 36111
1983-01-23 10.6 36111
解决方法
试一试:
df.groupby(level=['latitude','longitude'],group_keys=False).apply(lambda x: x.nlargest(n=3,columns=['FFDI','REF_ID']))
group_keys=False
是必需的,因为您使用 MultiIndex 进行分组,并且如果设置为 True
- 这是默认值 - groupby()
会将这些键冗余添加到输出的索引。
我创建了一个较小的数据集:
import numpy as np,pandas as pd
latitudes = [-39.200001,-39.200001,-39.200002]*10
longitudes = [140.800003,140.83786,150.000000]*10
sequence = [0,1,5,2,4,50,7]
times = pd.date_range(start='2020-06-01',end='2020-06-30')
s = pd.Series(
np.random.randn(len(sequence)*3),index=pd.MultiIndex.from_tuples(zip(latitudes,longitudes,times),names=['latitude','longitude','time'])
)
df = pd.DataFrame(s,columns=['FFDI'])
df['REF_ID'] = np.random.randint(0,36111,len(sequence) * 3)
然后测试:
In [48]: df.groupby(level=['latitude','REF_ID']))
Out[48]:
FFDI REF_ID
latitude longitude time
-39.200002 150.000000 2020-06-09 1.658600 32650
2020-06-24 1.412439 6124
2020-06-06 0.248274 15765
-39.200001 140.800003 2020-06-13 0.906517 6980
2020-06-25 0.757745 27483
2020-06-04 0.671170 31313
140.837860 2020-06-20 1.162408 20113
2020-06-14 1.014437 34023
2020-06-11 0.657841 8366
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。