2016-12-07 11 views
-1

У меня есть dataframe, как показано ниже:Возврат столбец для первого вхождения «1» в строке

Когда есть изменение в колонке «Col», мне нужно сканировать столбцы, колы, colb, colc, cola1 , colb1, colc1 для первого появления «1».

Тогда условие колу == cola1 == 1 или colb == colb1 == 1 или colc == colc1 == 1 должен удовлетворять, и вернуть это имя столбца в новом столбце "New_col"

Вход:

 cola colb colc cola1 colb1 colc1 col 
     0  0 0  0  0  0  18 
     1  0 0  1  1  0  18 
     1  0 0  1  1  0  18 
     1  0 0  1  1  0  18 
     1  0 0  1  1  0  18 
     0  0 0  0  0  0  24 
     0  1 0  0  1  0  24 
     0  1 0  0  1  0  24 
     0  1 0  0  1  0  24 
     0  1 0  0  1  0  24 
     0  0 0  0  1  0  10 

Ожидаемый результат:

 cola colb colc cola1 colb1 colc1 col New_col 
    0  0 0  0  0  0  18  
    1  0 0  1  1  0  18 
    1  0 0  1  1  0  18 
    1  0 0  1  1  0  18 
    1  0 0  1  1  0  18 
    0  0 0  0  0  0  24  cola 
    0  1 0  0  1  0  24 
    0  1 0  0  1  0  24 
    0  1 0  0  1  0  24 
    0  1 0  0  1  0  24 
    0  0 0  0  1  0  10 colb 
+1

Что делать, если все 3-условия удовлетворяют. какой результат вы хотите? есть ли какое-либо преимущество? –

+0

Я не понимаю, почему вывод в строке. Потому что кажется, что это первое появление предыдущей группы. Можете ли вы объяснить больше? – jezrael

+0

В 5-й строке значение столбца «col» изменяется от 0 до 1. Следовательно, мне нужно сканировать все остальные столбцы выше этой строки для первого появления «1». И возвращаемый результат должен удовлетворять: Только когда cola и cola1 = 1 или colb и colb1 = 1 или colc и colc1 = 1. – Anagha

ответ

1

почти полный ответ:

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

df['conda'] = (df['cola'] == 1) & (df['cola1'] == 1) 
df['condb'] = (df['colb'] == 1) & (df['colb1'] == 1) 
df['condc'] = (df['colc'] == 1) & (df['colc1'] == 1) 

df['anycond'] = df['conda'] | df['condb'] | df['condc'] 

Второй, определить функцию, которая принимает первое истинное состояние (из a, b, c), как только любое условие правда:

def get_first_condition(g): 
    if not g['anycond'].any(): 
     return np.nan 
    mask = g.loc[g['anycond'], ['conda', 'condb', 'condc']].iloc[0].values 
    return np.array(['cola', 'colb', 'cocl'])[mask][0] 

Третий, применяются к dataframe сгруппированных по col:

df.groupby('col').apply(get_first_condition) 

col 
10  NaN 
18 cola 
24 colb 

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

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

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