如果ID出现多次,Pandas会选择行

Hai*_* Vu 9 python group-by dataframe pandas pandas-groupby

我有这样一张桌子:

CustID  Purchase  Time
A       Item1     01/01/2011
B       Item2     01/01/2011   
C       Item1     01/02/2011   
A       Item2     03/01/2011   
Run Code Online (Sandbox Code Playgroud)

我想在表中选择CustID显示多于1的行.

lan*_*tar 15

这可能有效:

counts = df['CustID'].value_counts()
df[df['CustID'].isin(counts.index[counts > 1])]
Run Code Online (Sandbox Code Playgroud)

结果:

  CustID Purchase        Time
0      A    Item1  01/01/2011
3      A    Item2  03/01/2011
Run Code Online (Sandbox Code Playgroud)

  • 这是我的方法,再加上一个.为了提高效率,可以将`sort = False`传递给`value_counts` (2认同)

bun*_*nji 12

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

这将查找数据框中列中存在重复项的CustID行.该keep=False通知duplicated功能,以纪念所有重复行的True(而不是仅仅在第一个或最后的):

  CustID Purchase        Time
0      A    Item1  01/01/2011
3      A    Item2  03/01/2011
Run Code Online (Sandbox Code Playgroud)

编辑

查看文档,duplicated看起来你也可以这样做:

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

虽然这似乎比原始速度慢约100μs(458μs与基于示例数据帧的545μs相比)


piR*_*red 9

使用 filter

df.groupby('CustID').filter(lambda x: len(x) > 1)
Run Code Online (Sandbox Code Playgroud)
  CustID Purchase        Time
0      A    Item1  01/01/2011
3      A    Item2  03/01/2011
Run Code Online (Sandbox Code Playgroud)