繁体   English   中英

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

[英]How can i filter a dataframe's rows by specific bins

假设我有一个数据框:

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

首先,我对col2使用pandas.value_counts() ,我使用三个bin (0,5] (5,10] (10,15]

然后,我想过滤col2值属于频率最高的前两个bin的行,在本例中为bin (5,10](10,15]

采用:

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

如果您为每行添加了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的回答。

这应该使用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

暂无
暂无

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

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