pandas:如何在行匹配查询后获取每n行的组?

时间:2019-03-03 02:59:37

标签: python pandas numpy pandas-groupby

假设我有这个熊猫数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame({'x': np.random.randint(-10, 10, size=100),
                   'y': np.random.randint(-10, 10, size=100)})

我有任何选择行的查询,例如

query = (df['x'] > 3) & (df['y'] < 0)

如何获取与该查询以及接下来的连续k行匹配的行组(如果少于k,则返回可用行,但返回的行数多)?

例如,对于k = 2,这样做的麻烦而手动的方法是:

# 1st value
sel0 = df[query].reset_index()

# 2nd value
sel1 = df[query.shift(1).fillna(False)].reset_index()

# 3rd value
sel2 = df[query.shift(2).fillna(False)].reset_index()

concat_df = pd.concat([sel0, sel1, sel2])
grouped_df = concat_df.groupby(concat_df.index)
groups = [grouped_df.get_group(i) for i in grouped_df.groups]

是否存在可以将其推广到任何k并快速执行的单行代码?

1 个答案:

答案 0 :(得分:1)

我认为您可以使用cumsumgroupbyhead来做到这一点:

尝试一下,其中k = 2使用head(3),当前记录加两个:

df.groupby(query.cumsum()).head(3)

并概括一下

k=2
df.groupby(query.cumsum()).head(k+1)