如何按特定区间筛选数据框的行

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


1
请展示您想要的数据集。 - MaxU - stand with Ukraine
3个回答

7

使用:

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

2
我不知道value_counts函数中的bins参数! - piRSquared
2
@piRSquared 我也是! - BENY
2
嘘!我也不知道,直到原帖提到它,于是我看了文档。 :-) 这就是为什么我喜欢 Stack Overflow 的原因。 - Scott Boston
1
同样在这里... :-) - MaxU - stand with Ukraine

4

如果为每一行添加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

为了获得区间 (0, 5], (5, 10) 等,你需要设置 right=False

然后,筛选列 DF.bins 中具有所需最大值数量的值。

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

使用.index来获取一个最大箱子的列表,[: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的回答。

1
这将使用布尔索引和区间来筛选数据框:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接