Run*_*un2 2 python data-processing dataframe pandas
我有一个问题,我需要从数据帧中获取一组行,其中一组中的项数超过一定数量(截止)。对于那些小组,我需要坐一些头排和尾排。
我正在使用下面的代码
train = train[train.groupby('id').id.transform(len) > headRows]
groups = pd.concat([train.groupby('id').head(headRows),train.groupby('id').tail(1)]).sort_index()
Run Code Online (Sandbox Code Playgroud)
这可行。但是第一行非常慢:(。30分钟或更长时间。
有什么方法可以使第一行更快?如果我不使用第一行,则第二行的结果中存在重复的索引,这使事情变得混乱。
在此先感谢
注意:我的火车数据框包含约70,000个组,这些组的大小各不相同,超过700,000行。实际上,它来自我的另一个问题,如此处所示:在Python Pandas Dataframe中动态添加列的数据处理。Jeff在此处给出了一个很好的答案,但是如果组大小小于或等于我在连接行时传递给head(parameter)的参数,则失败,如Jeffs的回答:在[31]中:groups = concat .....
用途groupby/filter:
>>> df.groupby('id').filter(lambda x: len(x) > cutoff)
Run Code Online (Sandbox Code Playgroud)
这只会返回数据框的行,其中组的大小大于截止值。而且,它应该表现得更好。我filter在这里给一个数据帧计时,该数据帧包含30039个“ id”组和大约400万个观察值:
In [9]: %timeit df.groupby('id').filter(lambda x: len(x) > 12)
1 loops, best of 3: 12.6 s per loop
Run Code Online (Sandbox Code Playgroud)