根据定义pandas中的类别的列过滤掉没有足够观察次数的DataFrame行

问题描述 投票:1回答:2

我有一个DataFrame,其中一列将数据集划分为一组类别。我想删除那些观察数量较少的类别。

df = pd.DataFrame({'c': ['c1', 'c2', 'c1', 'c3', 'c4', 'c5', 'c2'], 'v': [5, 2, 7, 1, 2, 8, 3]})

    c  v
0  c1  5
1  c2  2
2  c1  7
3  c3  1
4  c4  2
5  c5  8
6  c2  3

对于列cn = 2,删除列n中具有小于c相同值的所有行,从而导致:

    c  v
0  c1  5
1  c2  2
2  c1  7
3  c2  3
python pandas dataframe filtering counter
2个回答
2
投票

使用pd.Series.value_counts,然后通过pd.Series.isin进行布尔索引:

counts = df['c'].value_counts()  # create series of counts
idx = counts[counts < 2].index   # filter for indices with < 2 counts

res = df[~df['c'].isin(idx)]     # filter dataframe

print(res)

    c  v
0  c1  5
1  c2  2
2  c1  7
6  c2  3

1
投票

通过使用groupby这可以实现如下:

mask = df.groupby('c').count().reset_index()
mask = mask.loc[mask['v'] < 2]
res = df[~df.c.isin(mask.c.values)]
print(res)

输出:

    c  v
0  c1  5
1  c2  2
2  c1  7
6  c2  3
© www.soinside.com 2019 - 2024. All rights reserved.