繁体   English   中英

如何在value_counts上对pandas数据框进行子集化?

[英]How to subset a pandas dataframe on value_counts?

我有以下pandas数据帧

import pandas as pd
df = pd.read_csv("filename1.csv")

df
    column1  column2   column3
0        10       A          1
1        15       A          1
2        19       B          1
3      5071       B          0
4      5891       B          0
5      3210       B          0
6        12       B          2
7        13       C          2
8        20       C          0
9         5       C          3
10        9       C          3

现在,使用函数value_counts()将给出特定列中每个值的计数,例如

df.column3.value_counts()

1   3
2   2
3   2

但是,我想根据给定列中的值的数量对pandas数据帧进行子集化。 例如,在上面的数据帧df ,我想在具有3个或更多唯一值(不包括0)的行上进行子集化。 在这种情况下,结果数据帧将是

df
    column1  column2   column3
0        10       A          1
1        15       A          1
2        19       B          1

由于行的值2和3只有两行,即2,3只出现两次column3 大熊猫的做法是什么?

你可以使用groupby.filter ; 在过滤器中,为每个组构造一个唯一的布尔值来过滤数据框:

df.groupby("column3").filter(lambda g: (g.name != 0) and (g.column3.size >= 3))

在此输入图像描述

另一个选择可能是:

df[(df.column3 != 0) & (df.groupby("column3").column3.transform("size") >= 3)]

或者您可以在分组之前过滤掉零:

 df1[df1['column3'] != 0].groupby("column3").filter(lambda x: x['column3'].size >= 3 )

替代方案:

In [132]: cnt = df.column3.value_counts()

In [133]: cnt
Out[133]:
0    4
1    3
3    2
2    2
Name: column3, dtype: int64

In [134]: v = cnt[(cnt.index != 0) & (cnt >= 3)].index.values

In [135]: v
Out[135]: array([1], dtype=int64)

In [136]: df.query("column3 in @v")
Out[136]:
   column1 column2  column3
0       10       A        1
1       15       A        1
2       19       B        1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM