选择熊猫中条件为真的所有行

Posted

技术标签:

【中文标题】选择熊猫中条件为真的所有行【英文标题】:Select all rows from where a condition is true in pandas 【发布时间】:2019-06-16 09:58:08 【问题描述】:

我有一个数据框

 Id  Seqno. Event
 1     2    A 
 1     3    B 
 1     5    A 
 1     6    A 
 1     7    D
 2     0    E
 2     1    A 
 2     2    B 
 2     4    A 
 2     6    B

我想获取自每个 ID 最近出现的模式 A =​​ 2 的计数以来发生的所有事件。序号。是每个 ID 的序列号。 输出将是

 Id  Seqno. Event 
 1     5    A 
 1     6    A 
 1     7    D
 2     1    A 
 2     2    B 
 2     4    A 
 2     6    B

到目前为止我都试过了,

  y=x.groupby('Id').apply( lambda 
  x:x.eventtype.eq('A').cumsum().tail(2)).reset_index()
  p=y.groupby('Id').apply(lambda x:       
  x.iloc[0]).reset_index(drop=True)
  q= x.reset_index()
  s= pd.merge(q,p,on='Id')
  dd= s[s['index']>=s['level_1']]

我想知道是否有一个好的方法。

【问题讨论】:

第 2 组不应该只包括最后 2 行吗?因为我们正在寻找第二次出现 A 的行......如果我错了,请纠正我。 感谢@coldspeed。实际上,对于每个组,我们都从最后一个或最近的事件中计算 A。一旦我们的计数等于 2,我们将返回所有行(包括第二次出现的行),直到该组的结束(最近)事件。 逻辑仍然没有意义。对于 ID 2,您将包含 seq no 1 的行,其中 A 的计数仍为 1。 是的,@Vaishali,没错。对我来说仍然没有意义,OP。 这是从组底部向上计数的第二次出现,然后返回下面的所有内容 【参考方案1】:

使用groupbycumsum,从每组A 的计数中减去它,然后过滤:

g = df['Event'].eq('A').groupby(df['Id'])
df[(g.transform('sum') - g.cumsum()).le(1)]

   Id  Seqno. Event
2   1       5     A
3   1       6     A
4   1       7     D
6   2       1     A
7   2       2     B
8   2       4     A
9   2       6     B

【讨论】:

【参考方案2】:

感谢冷、ALollz 和 Vaishali,通过解释(来自评论)使用 groupbycumcount 得到计数,然后我们使用 reindexffill

s=df.loc[df.Event=='A'].groupby('Id').cumcount(ascending=False).add(1).reindex(df.index)
s.groupby(df['Id']).ffill()
Out[57]: 
0    3.0
1    3.0
2    2.0
3    1.0
4    1.0
5    NaN
6    2.0
7    2.0
8    1.0
9    1.0
dtype: float64
yourdf=df[s.groupby(df['Id']).ffill()<=2]
yourdf
Out[58]: 
   Id  Seqno. Event
2   1       5     A
3   1       6     A
4   1       7     D
6   2       1     A
7   2       2     B
8   2       4     A
9   2       6     B

【讨论】:

以上是关于选择熊猫中条件为真的所有行的主要内容,如果未能解决你的问题,请参考以下文章

Dapper中条件为In的写法

在 MATLAB 中条件选择所有可能的参数组合

在MATLAB中条件选择所有可能的参数组合

熊猫数据框合并选择列

按给定列表的顺序选择重复的熊猫数据框行并保留原始索引

从熊猫数据框中选择特定行