按出现次数分组

时间:2018-11-25 20:06:14

标签: python pandas dataframe counter pandas-groupby

嗨,我想删除出现次数小于数字的条目的行,例如:

df = pd.DataFrame({'a': [1,2,3,2], 'b':[4,5,6,7], 'c':[0,1,3,2]})
df
   a  b  c
0  1  4  0
1  2  5  1
2  3  6  3
3  2  7  2

如果列“ a”中的出现次数少于两次,我想删除所有行。
想要的输出:

   a  b  c
1  2  5  1
3  2  7  2

我所知道的: 我们可以通过condition = df['a'].value_counts() < 2来找到出现次数,它会给我类似的信息:

2    False
3    True
1    True
Name: a, dtype: int64

但是我不知道如何从这里删除行。
预先感谢!

3 个答案:

答案 0 :(得分:2)

您可以使用df.wheredropna

df.where(df['a'].value_counts() <2).dropna()

     a   b   c
1   2.0 5.0 1.0
3   2.0 7.0 2.0

答案 1 :(得分:2)

您可以尝试执行类似的操作来获取每个组的长度,转换回原始索引并以此为索引df

df[df.groupby("a").transform(len)["b"] >= 2]


    a   b   c
1   2   5   1
3   2   7   2

将其分解成单个步骤:

df.groupby("a").transform(len)["b"]

0    1
1    2
2    1
3    2
Name: b, dtype: int64

这些是将组大小转换回原始索引的

df.groupby("a").transform(len)["b"] >=2

0    False
1     True
2    False
3     True
Name: b, dtype: bool

然后将其转换为布尔索引,并以此为原始数据帧建立索引

答案 2 :(得分:2)

groupby + size

res = df[df.groupby('a')['b'].transform('size') >= 2]

transform方法将df.groupby('a')['b'].size()映射到与df对齐的df['a']

value_counts + map

s = df['a'].value_counts()
res = df[df['a'].map(s) >= 2]

print(res)

   a  b  c
1  2  5  1
3  2  7  2