寻找更简单的方法来对熊猫进行分组和选择行

Har*_*ran 5 python pandas

df:

id c1 c2 c3
101  a b c
102  b c d
103  d e f
101  h i j
102  k l m
Run Code Online (Sandbox Code Playgroud)

我想根据对id列进行分组来选择行count > 1

结果应该是所有id条目超过1个的行

预期结果:

df:

id c1 c2 c3
101  a b c
102  b c d
101  h i j
102  k l m
Run Code Online (Sandbox Code Playgroud)

我可以使用下面编写的代码实现这一目标。

g = df.groupby('id').size().reset_index(name='counts')
filt = g.query('counts > 1')
m_filt = df.id.isin (filt.id)
df_filtered= df[m_filt]
Run Code Online (Sandbox Code Playgroud)

想检查是否有更好的方法。

jez*_*ael 3

GroupBy.transformGroupBy.sizefor一起使用,Series其大小与原始大小相同DataFrame,因此可以按以下条件过滤boolean indexing

df[df.groupby('id').transform('size')['id'].gt(1)]
Run Code Online (Sandbox Code Playgroud)

或者,如果需要所有重复的行,请DataFrame.duplicated使用keep=False

df[df.duplicated('id', keep=False)]
Run Code Online (Sandbox Code Playgroud)

或类似:

df[df['id'].duplicated(keep=False)]
Run Code Online (Sandbox Code Playgroud)

  • 嗯,正确的方法应该是`df.groupby('id')['id'].transform('size')`。最好在发布代码之前运行代码。 (2认同)