【问题标题】:Pandas filter dataframe based on condition for the first n rowsPandas 根据前 n 行的条件过滤数据帧
【发布时间】:2019-08-17 11:03:25
【问题描述】:

我有一个形状为 [600 000, 19] 的数据框。我想根据一个条件过滤前 100 000 行,根据另一个条件过滤下 300 000 行,最后一行的第三个条件。我想知道如何做到这一点。

目前,我将数据框分成 3 段并应用它们各自的条件。然后,我重新连接数据框。有没有更好的办法?

示例:根据任何小于 5 的值过滤前 100 000 行。对于第二个 300 000 行,我不想要任何大于 40 的值,等等。

【问题讨论】:

  • 将索引重置为列,然后您可以将行序号合并到您的条件中
  • 尝试使用 .iloc 创建三个掩码,然后使用“或”( | ) 一次将三个掩码应用于数据帧。

标签: python pandas filtering conditional-statements


【解决方案1】:

您可以尝试以下方法:

import pandas as pd

sample = pd.DataFrame({'x' : pd.np.arange(100),
                       'colname': pd.np.arange(100)})
conditions = [('index < 5', 'colname < 3'), 
              ('index > 50', 'index < 100', 'colname < 55')]
sample.query('|'.join(map(lambda x: '&'.join(x), conditions)))

【讨论】:

  • 谢谢!这绝对能够在不拆分和重新连接的情况下完成任务。我还学到了一些关于 Pandas 的其他知识。
【解决方案2】:

方法是使用带有pd.concat 的数据帧索引切片来构建完整的布尔系列:

import numpy as np
import pandas as pd
np.random.seed(0)
df=pd.DataFrame(np.random.randint(0,50,60))

df[pd.concat([df.iloc[:10] > 10, df[11:40] < 30, df[41:] % 2 == 0])]

前 10 个记录过滤小于 10 的记录,接下来的 30 个值过滤大于 30 的记录,最后一个值检查偶数。

然后你可以使用 dropna 删除所有的 NaN 值

输出:

      0
0   44.0
1   47.0
2    NaN
3    NaN
4    NaN
5   39.0
6    NaN
7   19.0
8   21.0
9   36.0
10   NaN
11   6.0
12  24.0
13  24.0
14  12.0
15   1.0
16   NaN
17   NaN
18  23.0
19   NaN
20  24.0
21  17.0
22   NaN
23  25.0
24  13.0
25   8.0
26   9.0
27  20.0
28  16.0
29   5.0
30  15.0
31   NaN
32   0.0
33  18.0
34   NaN
35  24.0
36   NaN
37  29.0
38  19.0
39  19.0
40   NaN
41   NaN
42  32.0
43   NaN
44   NaN
45  32.0
46   NaN
47  10.0
48   NaN
49   NaN
50   NaN
51  28.0
52  34.0
53   0.0
54   0.0
55  36.0
56   NaN
57  38.0
58  40.0
59   NaN

【讨论】:

  • 谢谢!这绝对是我原来的一个更干净的版本,然后我删除了 na 并重置了索引,它工作得很好。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2020-08-29
相关资源
最近更新 更多