嗨,我想删除出现次数小于数字的条目的行,例如:
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
但是我不知道如何从这里删除行。
预先感谢!
答案 0 :(得分:2)
您可以使用df.where
和dropna
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