2016-02-09 2 views
1

Я недавно задал вопрос, на который был дан ответ - How do I add conditionally to a selection of cells in a pandas dataframe column when the the column is a series of lists?, но я считаю, что у меня есть новая проблема, о которой я раньше не думал.Вектовое решение для выбора условных данных

В следующей структуре данных мне нужно два условия, чтобы привести к изменению в столбце d. Каждое значение в столбце d является list.

  • Где a == b, конечное целое число в d увеличивается на единицу.
  • Где a != b, список целых чисел увеличивается, а значение 1 вставляется в конце list в колонке d.

    a  b  c   d   
    On  On  [0]   [0,3]  
    On  Off  [0]   [0,1] 
    On  On  [0]   [2]   
    On  On  [0]   [0,4,4]   
    On  Off  [0]   [0] 
    
  • В результате dataframe хотел бы это:

    a  b  c  d  
    On  On  [0]  [0,4]  
    On  Off  [0]  [0,1,1]  
    On  On  [0]  [3] 
    On  On  [0]  [0,4,5] 
    On  Off  [0]  [0,1] 
    

Я понимаю, что это может быть сделано с помощью pd.Series.apply метода в сочетании с заранее определенной функции или использование lambda однако кадр данных состоит из 100000 строк, и я надеялся, что может существовать векторное решение этих двух условий.

+1

Хранением нескалярного значения в качестве элементов данных опрометчиво и, как правило, вы потеряете доступ к vectorised методов, как нп и панды не имеет vectorised методы для добавления к список в векторном виде – EdChum

+0

У меня было ощущение, что это может быть так. Как новый пользователь панд, что является более типичным способом захвата этих данных? В кадре данных имеется примерно полмиллиона обновлений, которые выполняются каждый раз с различными результатами в col 'a' и col' b'. Если 'a == b', то счет увеличивается, и если' a! = B', нужно запустить новый счет. – orgelzyklus

ответ

0

As Edchum says, vecorised решение может быть проблематичным.

Один не Векторизованное решения с apply обычаем functions:

df['e'] = df['d'] 

def exten(lst): 
    return lst + [1] 

def incre(lst): 
    lst[-1] = lst[-1] + 1 
    return lst 

df.loc[df.a != df.b, 'd'] = df.e.apply(exten) 
df.loc[df.a == df.b, 'd'] = df.e.apply(incre) 
df = df.drop('e', axis=1) 
print df 
    a b c   d 
0 On On [0]  [0, 4] 
1 On Off [0] [0, 1, 1] 
2 On On [0]  [3] 
3 On On [0] [0, 4, 5] 
4 On Off [0]  [0, 1] 
+0

Hi, очень оценен. Это в значительной степени то, что я использую в настоящее время (хотя ваши функции более элегантны!), Но из-за того, что количество строк слишком велико для его предполагаемого использования. – orgelzyklus

+0

Да, я пытаюсь найти лучшее решение. Но вопрос: column 'c' является' list' длины '1'? – jezrael

+0

да это спасибо. – orgelzyklus

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