2016-03-07 3 views
0

Мне интересно о существующих функциях pandas, которых я, возможно, пока не смог найти.Отфильтровать данные итеративно в кадре данных Python

Базисно, у меня есть кадр данных с различными столбцами. Я хотел бы выбрать определенные строки в зависимости от значений определенных количеств (FYI: меня интересовало значение столбца D, в котором было несколько параметров, описанных в A-C).

E.g. Я хочу знать, какие строки имеют A == 1 & B == 2 & C == 5?

df 
    A B C D 
0 1 2 4 a 
1 1 2 5 b 
2 1 3 4 c 

df_result 
1 1 2 5 b 

До сих пор я был в состоянии в основном уменьшить это:

import pandas as pd 

df = pd.DataFrame({'A': [1,1,1], 
        'B': [2,2,3], 
        'C': [4,5,4], 
        'D': ['a', 'b', 'c']}) 
df_A = df[df['A'] == 1] 
df_B = df_A[df_A['B'] == 2] 
df_C = df_B[df_B['C'] == 5] 

Для этого:

parameter = [['A', 1], 
      ['B', 2], 
      ['C', 5]] 

df_filtered = df 
for x, y in parameter: 
    df_filtered = df_filtered[df_filtered[x] == y] 

, которые дали те же результаты. Но мне интересно, есть ли другой способ? Может быть, без цикла в одной строке?

+0

Вы можете комбинировать свои условия 'df [(df ['A'] == 1) & (df ['B'] == 2) & (df ['C'] == 5)]' без использования a loop – EdChum

+0

Но что, если я не знаю заранее, как мои столбцы вызываются и какие значения я хочу, чтобы они имели? – fukiburi

+0

Что это значит? В какой-то момент у вас должна быть какая-то идея, какие столбцы и значения сравнивать? Вы можете легко построить условия – EdChum

ответ

1

Вы можете использовать query() метод для фильтрации данных, и построить выражение фильтра из параметров, как

In [288]: df.query(' and '.join(['{0}=={1}'.format(x[0], x[1]) for x in parameter])) 
Out[288]: 
    A B C D 
1 1 2 5 b 

Детали

In [296]: df 
Out[296]: 
    A B C D 
0 1 2 4 a 
1 1 2 5 b 
2 1 3 4 c 

In [297]: query = ' and '.join(['{0}=={1}'.format(x[0], x[1]) for x in parameter]) 

In [298]: query 
Out[298]: 'A==1 and B==2 and C==5' 

In [299]: df.query(query) 
Out[299]: 
    A B C D 
1 1 2 5 b 
+0

Вау, спасибо! Я не знал о 'query'. Как мне изменить код, если я хочу сравнить строки вместо целых чисел? Если изменить все значения на строки, 'df.query()' возвращает пустой DataFrame ... – fukiburi

+0

А, я понял! Просто замените '' {0} == {1} ''на'' {0} == \ "{1} \" ''. – fukiburi

0

Просто для информации, если другие заинтересованы, я бы сделал это это путь:

import numpy as np 
matched = np.all([df[vn] == vv for vn, vv in parameters], axis=0) 
df_filtered = df[matched] 

Но мне нравится query функционирует лучше, теперь, когда я видел его @ Джона Галта.

+0

Все еще, спасибо за ваш вклад! Я тоже буду помнить об этом методе. Может быть полезным в будущем. – fukiburi

Смежные вопросы