假设我有一个数据框:
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]
。
答案 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