[英]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.