Фильтр панд с цепочкой операторов из списка - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть таблица панд, которая содержит несколько столбцов:

col_list = list('ABC')
df = pd.DataFrame(np.random.randint(10, size=(5,3)), columns=col_list)

    A   B   C
0   8   5   7
1   5   4   1
2   7   5   6
3   6   6   0
4   3   4   1

, и у меня есть список порогов, по которым я хочу отфильтровать df:

thr = [3, 6, 9]

IsСуществуют способы фильтрации df в каждом столбце согласно соответствующему порогу в thr, так что

new_df = df[(df['A']>thr[0]) & (df['B']>thr[1]) & (df['C']>thr[2]) )

без явной записи его с использованием списка операторов, что-то вроде

not_sure = [df.iloc[:, [i]]>thr[i] for i in range(3)]

1 Ответ

0 голосов
/ 25 ноября 2018

Используйте boolean indexing с логической маской, созданной np.all:

print (df)
   A  B   C
0  5  8  10
1  5  4   1
2  7  5   6
3  6  6   0
4  3  4   1

thr = [3, 6, 9]

df = df[np.all(df.values > np.array(thr), axis=1)]
print (df)
   A  B   C
0  5  8  10

Решение для панд с DataFrame.gt (>) с DataFrame.all:

df = df[df.gt(thr).all(axis=1)]
print (df)
   A  B   C
0  5  8  10

И решение с совместным списком:

masks = [df.iloc[:, i] > j for i, j in enumerate(thr)]
df = df[pd.concat(masks, axis=1).all(axis=1)]

Альтернатива:

df = df[np.logical_and.reduce(masks)]

Объяснение :

Сначала сравните все значения по np.array - необходимы одинаковые длины thr и столбцы:

print (df.values > np.array(thr))
[[ True  True  True]
 [ True False False]
 [ True False False]
 [ True False False]
 [False False False]]

Затем проверьте все True с на строки по numpy.all:

print (np.all(df.values > np.array(thr), axis=1))
[ True False False False False]
...