我正在使用以下DataFrame:
Date Id Amount
0 201301 1 nan
1 201302 1 nan
2 201303 1 100
3 201304 1 120
4 201305 1 nan
5 201306 1 120
6 201302 2 nan
7 201303 2 150
8 201304 2 180
我试图通过Id
得到Amount
的第一个有效索引,但由于某些原因,这不起作用:
df.groupby('Id').Amount.first_valid_index()
我也在尝试这个:
df.groupby('Id').Amount.apply(lambda x: x.first_valid_index())
但我的数据集是20M+行,所以它需要太长的时间,这对我来说不起作用。
有没有更快的方法按组查找第一个索引?
我期望的输出是:
first_idx = [2,7]
或者更好:
Date Id Amount
2 201303 1 100
3 201304 1 120
4 201305 1 nan
5 201306 1 120
7 201303 2 150
8 201304 2 180
编辑:df.groupby('Id').Amount.apply(lambda x: x.first_valid_index())
确实有效,但我觉得必须有一个更快的选择,问题似乎并不复杂。
3条答案
按热度按时间juzqafwq1#
**选项1:**仅获取前几个索引:
产出:
**选项2:**要获取其他行,请对
notna()
使用cumsum
**选项3:**您可以在组内
ffill()
,并选择未填充的:输出:
结论:选项3最快!
**更新:**使用选项3过滤两端:
relj7zay2#
用
.notnull
+.cumsum
创建一个掩码,以获取组中第一个非空Amount
之后的所有内容,然后创建一个切片。u0njafvf3#
如果还需要移位(例如,从第一个有效索引之前的索引开始),使用ffill()和shift()作为链式调用将移位帧而不是组。