2015-09-18 1 views
3

Я пытаюсь выбрать строки из фреймворка pandas, применяя условие к столбцу (в форме логического выражения).Запуск логических выражений против pandas dataframe

кадр Образец данных выглядит следующим образом:

id    userid    code 
    0   645382311   12324234234 
    1   645382311   -2434234242 
    2   645382312   32536365654 
    3   645382312   12324234234 

...

К примеру, я ожидаю следующий результат, применяя логические выражения для столбца 'код':

case 1: (12324234234 OR -2434234242) AND NOT 32536365654 
    case 2: (12324234234 AND -2434234242) OR NOT 32536365654 
    must give a result for both cases: 
    userid: 645382311 

Логика выше говорит: Для случая 1 - дайте мне только те пользователи, которые имеют хотя бы одно из значений (12324234234 OR -2434234242) и не имеют 32536365654 в целом да ta рама. Для случая 2 - мне нужно только те, кто имеет идентификатор пользователя либо как коды в кадре данных (12324234234 И -2434234242) или любые коды, но не 32536365654.

Заявление, как показано ниже возвращает пустой DataFrame:

flt = df[(df.code == 12324234234) & (df.code == -2434234242)] 
    print("flt: ", flt) 

Результат (и делает это):

flt: Empty DataFrame 

Был бы признателен за любые намеки на обработку таких случаев.

+0

Условия кажутся немного странными: для случая 1 «И НЕ 32536365654'' является избыточным; для случая 2, '' (12324234234 AND -2434234242) '' избыточно. –

+0

Все в порядке. Для случая 1 мне нужен только тот пользователь, который имеет хотя бы одно из значений (12324234234 OR -2434234242) и не имеет 32536365654 во всем фрейме данных. Для случая 2 все в порядке, мне нужны только те пользователи, которые имеют оба кода в кадре данных или любых кодах, но не 32536365654. – Alex

+0

Вы можете найти пользователей с кодом 32536365654, а затем использовать df [~ df.userid.isin()] метод для выбора пользователей, которые не имеют этого кода. См. Http://stackoverflow.com/questions/19960077/how-to-implement-in-and-not-in-for-pandas-dataframe –

ответ

1

В качестве простого подхода, я бы преобразовать таблицу выборки в булеву матрицу присутствия, который затем позволит вам выполнить логику нужно:

import pandas 
sample = pandas.DataFrame([[645382311, 12324234234], [645382311, -2434234242], [645382312, 32536365654], [645382312, 12324234234]], columns=['userid', 'code']) 
# Add a column of True values 
sample['value'] = True 
# Pivot to boolean presence matrix and remove MultiIndex 
presence = sample.pivot(index='userid', columns='code').fillna(False)['value'] 
# Perform desired boolean tests 
case1 = (presence[12324234234] | presence[-2434234242]) & ~(presence[32536365654]) 
case2 = (presence[12324234234] & presence[-2434234242]) | ~(presence[32536365654]) 

В case переменные будет содержать логический результат теста для каждый идентификатор пользователя.

+0

Спасибо, @pbarber! Он работает хорошо. Единственное, что имеет определение случаев в таких формах, как '(-1111111AND2222222) NOT (-3333333)' Я использую ** regexp ** для преобразования их в соответствующую форму 'case = '((presence [-1111111] & наличие [2222222]) & ~ (наличие [-3333333])) '' поэтому для выполнения логических тестов. И так как этот случай имеет тип ** String **, единственный способ его оценить - использовать 'eval (case)'. Есть ли у вас какие-либо мысли или, возможно, другие доступные варианты для оценки таких случаев? – Alex

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

  • Нет связанных вопросов^_^