Фильтр данных Pandas на основе условия для первых n строк - PullRequest
4 голосов
/ 27 марта 2019

У меня есть данные в форме [600 000, 19]. Я хочу отфильтровать первые 100 000 строк на основе одного условия, следующие 300 000 строк на основе другого условия и 3-е условие для последних строк. Мне было интересно, как это можно сделать.

В настоящее время я разделяю фрейм данных на 3 сегмента и применяю их соответствующие условия. Затем я повторно объединяю фрейм данных. Есть ли лучший способ?

Пример: отфильтровать первые 100 000 строк на основе любого значения меньше 5. Для вторых 300 000 строк я не хочу, чтобы значения были больше 40 и т. Д.

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Вы можете попробовать следующий подход:

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)))
1 голос
/ 27 марта 2019

На подходе было бы использовать нарезку индекса фрейма данных с 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, а последние значения проверяют четные числа.

Затем вы можете использовать дропну, чтобы удалить все значения 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
...