2016-05-08 3 views
1

в Pandas Я хочу добавить значение в один столбец «B» в зависимости от булевых значений из другого столбца «A». Поэтому, если «A» - «Истина», тогда начните подсчет (т. Е. Добавьте каждую новую строку), если «A» - false. Когда «A» - True сброс и снова начнет отсчет. Мне удалось сделать это с помощью цикла «за», но это очень трудоемко. Мне интересно, нет ли более эффективного решения времени?Добавление счетчика к предыдущей ячейке в Pandas

результат должен выглядеть следующим образом:

Date  A  B 
01.2010 False 0 
02.2010 True 1 
03.2010 False 2 
04.2010 False 3 
05.2010 True 1 
06.2010 False 2 

ответ

1

Вы можете использовать cumsum с groupby и cumcount:

print df 
    Date  A 
0 1.201 False 
1 1.201 True 
2 1.201 False 
3 2.201 True 
4 3.201 False 
5 4.201 False 
6 5.201 True 
7 6.201 False 
roll = df.A.cumsum() 
print roll 
0 0 
1 1 
2 1 
3 2 
4 2 
5 2 
6 3 
7 3 
Name: A, dtype: int32 

df['B'] = df.groupby(roll).cumcount() + 1 
#if in first values are False, output is 0 
df.loc[roll == 0 , 'B'] = 0 
print df 
    Date  A B 
0 1.201 False 0 
1 1.201 True 1 
2 1.201 False 2 
3 2.201 True 1 
4 3.201 False 2 
5 4.201 False 3 
6 5.201 True 1 
7 6.201 False 2 
0

спасибо, я получил решение от другой пост похож на это:

rolling_count = 0 
def set_counter(val): 

    if val == False: 

    global rolling_count 
    rolling_count +=1 

    else: 

    val == True 
    rolling_count = 1 

    return rolling_count 

df['B'] = df['A'].map(set_counter) 
+0

Я тестирую время как для решения, так и для первого решения другой вывод - первая строка имеет '1' в вашем решении, а не' 0' в столбце 'B'. И если контрольные тайминги с 'len (df) = 7000':'% timeit (al (df1)) 100 циклов, лучше всего 3: 3,75 мс за цикл 'против'% timeit (jez (df)) 100 циклов, лучше всего 3: 2,29 мс за цикл ». Последнее вы потеряли 2 очка за прием. Но это зависит от вас, если вы думаете, что лучше принять ваше решение. – jezrael

+0

И если нужно, нет проблем. ;) – jezrael

+0

@jezrael, большое спасибо. Исходя из Excel/vba, я нашел свое представленное решение более интуитивно понятным и выполнил эту работу в реальной жизни. Тем не менее ваше решение более pandaesque. Мне еще предстоит изучить разницу cumcount() и cumsum(). –

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