2017-01-22 4 views
0

Заголовок немного запутан, но, надеюсь, это поможет. Я хочу получить значение values, когда variableA == variableB == variableB текущей строки. Например, для первой строки, result будет 54 потому что единственный раз, когда эти условия выполнены в строке 3. Однако, если variableA == variableB в текущей строке, то результат будет 0. Пример данных:Python Pandas: выбор значения из строки, когда два значения в этой строке соответствуют значению в столбце

values variableA variableB 
    0 134  1    3 
    1 12  2    6 
    2 43  1    2 
    3 54  3    3 
    4 16  2    7 
    5 37  6    6 

Желаемый результат:

values variableA variableB result 
    0 134  1    3  54 
    1 12  2    6  37 
    2 43  1    2  16 
    3 54  3    3  0 
    4 16  2    7  NaN 
    5 37  6    6  0 

Не принимая во внимание 0 результат при variableA и variableB матч в текущей строке, моя попытка:

vars = df[['variableA', 'variableB']].values 
doublematch = (vars[:, None] == vars[None, :] == vars[:, [0]]).all(-1) 
df['result'] = df['values'].values @ doublematch #python3 

но это явно не работает. Благодаря!

+0

Всегда ли один к одному соответствует колонке дальше? Например, когда переменная B равна 2 в третьей строке, есть два 2, но только один вперед. Что произойдет, если впереди еще больше 2? Случается ли это когда-нибудь? –

+0

Если я правильно понимаю ваш вопрос, да, каждая переменная для переменной «переменная» и «переменная А» встречается более двух раз. Тем не менее, должен быть только один экземпляр, где строка имеет одну и ту же переменную в обоих столбцах (как, например, 'variableA == variableB' для этой строки). Столбцы были сгенерированы из кортежа frozenset, представляющего каждый уникальный кортеж из списка N элементов. –

ответ

1

Данные примера несовместимы, поскольку в верхней части данных нет строки 5, а нижняя строка данных имеет строку с индексом 4, изменяя переменную B на 2. Тем не менее, здесь представлено решение на основе использования join, а затем взятие последней строки любые дубликаты матчей.

Вот данные, которые я использую - я добавил дополнительную строку из вашего результирующего фрейма.

values variableA variableB 
    0 134  1    3 
    1 12  2    6 
    2 43  1    2 
    3 54  3    3 
    4 16  2    7 
    5 37  6    6 


s = df[['variableA', 'values']].set_index('variableA').squeeze() 
s.rename('result', inplace=True) 

df_final = df.join(s, on='variableB') 

df_final.loc[df_final['variableA'] == df_final['variableB'], 'result'] = 0 
df_final = df_final.reset_index().drop_duplicates('index', keep='last').set_index('index') 

     values variableA variableB result 
index          
0   134   1   3 54.0 
1   12   2   6 37.0 
2   43   1   2 16.0 
3   54   3   3  0.0 
4   16   2   7  NaN 
5   37   6   6  0.0