如何按特定的bin过滤数据帧的行

时间:2018-03-27 19:45:37

标签: python pandas

假设我有一个数据框:

col1  col2
15    2
17    4
14    5
20    10
21    11
19    11
18    12
20    6
22    7
21    8
22    8
25    6
21    7

首先,我使用pandas.value_counts()作为col2,我使用了三个分档(0,5] (5,10] (10,15]

然后,我想过滤col2值属于频率最高的前两个分箱的行,在这种情况下为分档(5,10](10,15]

3 个答案:

答案 0 :(得分:6)

使用:

s = df.col2.value_counts(bins=[0,5,10,15]).nlargest(2)
df[pd.cut(df.col2, s.index).notnull()]

输出:

    col1  col2
3     20    10
4     21    11
5     19    11
6     18    12
7     20     6
8     22     7
9     21     8
10    22     8
11    25     6
12    21     7

答案 1 :(得分:2)

如果您为每行添加了bin指示符以便能够根据它进行过滤,那么这将更容易解释。没有这个可以做到,但同样,这将更容易解释。

DF = pd.DataFrame({'A': [15, 17, 14, 20, 21, 19, 18, 20, 20, 22, 21, 22, 25, 21],
                  'B': [2, 4, 5, 10, 11, 11, 12, 6, 7, 8, 8, 6, 7, 12]})

bins = [0, 5, 10, 15]
DF['bins'] = pd.cut(DF.B, bins, right=False) #Adding the bins

您必须right=False才能获得间隔(0,5),(5,10)等等。

然后过滤具有所需最大值计数元素值的列DF.bins

DF[DF.bins.isin(DF.bins.value_counts().index[:2])]

调用.index获取最大的二进制列表,[:2]获得最高的2个二进制位。

    A   B   bins
2   14  5   [5, 10)
3   20  10  [10, 15)
4   21  11  [10, 15)
5   19  11  [10, 15)
6   18  12  [10, 15)
7   20  6   [5, 10)
8   20  7   [5, 10)
9   22  8   [5, 10)
10  21  8   [5, 10)
11  22  6   [5, 10)
12  25  7   [5, 10)
13  21  12  [10, 15)

如果您想在不添加新列的情况下执行此操作,请按Floydian's answer。

答案 2 :(得分:1)

这应该使用bin:

基于布尔索引过滤数据帧
top_2 = pd.value_counts(df.col2, bins=[0, 5, 10, 15]).nlargest(2)
df[~pd.cut(df.col2, top_2.index).isnull()]

输出:

    col1  col2
3     20    10
4     21    11
5     19    11
6     18    12
7     20     6
8     22     7
9     21     8
10    22     8
11    25     6
12    21     7