当列值在具有组过滤器的另一行列值的范围内时,Pandas会选择行

时间:2018-02-13 14:55:22

标签: python pandas

我想在link to question

上提出一个问题

情景更复杂,所以我认为那里的解决方案不合适

我正在尝试使用以下格式从数据框(100k-500k行)创建子集

d = {'time':[1,2,3,5,7,9,9.5,10], 'val':['not','match','match','not','not','match','match','match'],
    'group':['a','a','b','b','b','a','a','c']}
df = pd.DataFrame(d)
print(df)
  group  time    val
0     a   1.0    not
1     a   2.0  match
2     b   3.0  match
3     b   5.0    not
4     b   7.0    not
5     a   9.0  match
6     a   9.5  match
7     c  10.0  match

我想在时间在有限范围内时选择包含所有行的子集。例如,如果range是< = 1,则选择第一行和最后三行,并且来自不同的组

  • row0具有有效时间差异(row1-row0),但它们位于同一组中。
  • row1具有有效时间差异(row2-row1),每个都有不同的组。
  • row5具有有效时间差异(row7-row5),每个都有不同的组。
  • row6具有有效时间差异(row7-row6),每个都有不同的组。

我想要的输出

  group  time    val
1     a   2.0  match
2     b   3.0  match
5     a   9.0  match
6     a   9.5  match
7     c  10.0  match

1 个答案:

答案 0 :(得分:1)

这适用于您的示例,希望对您的数据有效:

df.loc[((df['time'].diff() <= 1)|(df['time'].diff(-1) >= -1))&((df['group']!=df['group'].shift(-1).fillna(df['group']))|(df['group']!=df['group'].shift(1).fillna(df['group'])))]