2016-08-04 3 views
1
df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1, 1], 'C' : [2,2,7,1]}) 

Я хочу получить эти строки в df1 на основе foll. Состояние:Запись функции python для извлечения совпадающих строк из pandas dataframe

df1.loc[(df1['A'] == 5) & (df1['B'] == 4) & (df1['C'] == 2)] 

Как я могу сделать его более универсальным, т.е. я хочу иметь функцию, где указать как имена столбцов и значение Я ищу в качестве аргументов.

ответ

3

One вариант должен был бы использовать query. Для условий в вашем вопросе это будет связано с построением строки по линиям 'A==5 & B==4 & C==2'.

Чтобы настроить проблему, я собираюсь предположить, что вы предоставили список кортежей в форме (column, comparison, value) в качестве условий, например ('A', '==', 5).

Тогда вы могли бы написать функцию вдоль линий:

def extract_matching_rows(df, conditions): 
    conditions = ' & '.join(['{}{}{}'.format(*c) for c in conditions]) 
    return df.query(conditions) 

Если вы заботитесь только о сравнениях равенства, можно просто жесткий код в '==' и исключить его из вашего состояния кортежей.

Пример использования со слегка различными условиями:

conditions = [('A', '>=', 5), ('B', '==', 4), ('C', '<', 3)] 
extract_matching_rows(df1, conditions) 

    A B C 
0 5 4 2 

Обратите внимание, что вы можете даже сравнить столбцы с query:

conditions = [('B', '>=', 'C'), ('A', '==', 5)] 
extract_matching_rows(df1, conditions) 

    A B C 
0 5 4 2 
1 5 2 2 
3 5 1 1 
+0

спасибо @root, работает ли ваше решение, если вместо номера есть сравнение строк? – user308827

+1

Да, но не очень просто. Строка запроса должна содержать в себе кавычки: ''A ==" yes "& B == 4''. Чтобы получить это, вам понадобятся кавычки в вашей строке, т. Е. Двойные кавычки в одинарных кавычках, определяющих вашу строку, или наоборот: '('A', '==', '' yes '')'. – root

+1

В качестве альтернативы вы можете реализовать проверку внутри своей функции, чтобы определить, сравниваете ли вы со строкой, а затем форматируете свой запрос несколько иначе, если это так: '' {} {} "{}" '. Format (* c) ' , – root

1

Вам нужно что-то вроде этого, filterdf ваша функция:

import pandas as pd 

df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1,1], 'C' : [2,2,7,1]}) 

def filterdf(df,col1,col2,val1,val2): 
    return df[(df[col1] == val1) & (df[col2] == val2)] 

df2 = filterdf(df1,'A','B',5,4) 
print(df2) 
Out: 
    A B C 
0 5 4 2 
+0

Пожалуйста, дайте мне знать, что это вопрос, прежде чем downvoting !! –

+0

@GuaravDhama Я не вижу проблемы. На мой взгляд, такое голосование не было оправдано. +1 от меня. – piRSquared

2

Назначают то, что вы ищете в серии

# first row of df1 
looking_for = df1.iloc[0, :] 

Затем оценить равенство и найти, где все равны в ряд.

df1.eq(looking_for).all(1) 

0  True 
1 False 
2 False 
3 False 
dtype: bool 

Используйте это в качестве фильтра

df1[df1.eq(looking_for).all(1)] 

enter image description here

обобщенно, назначить любую серию

looking_for = pd.Series([1, 5, 7], list('BAC')) 

df1[df1.eq(looking_for).all(1)] 

enter image description here

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