2016-08-24 8 views
3

Давайте сказать, что я это dfМогу ли я создать новый столбец на основе того, когда значение изменится в другом столбце?

print(df) 
       DATE_TIME A B 
0 10/08/2016 12:04:56 1 5 
1 10/08/2016 12:04:58 1 6 
2 10/08/2016 12:04:59 2 3 
3 10/08/2016 12:05:00 2 2 
4 10/08/2016 12:05:01 3 4 
5 10/08/2016 12:05:02 3 6 
6 10/08/2016 12:05:03 1 3 
7 10/08/2016 12:05:04 1 2 
8 10/08/2016 12:05:05 2 4 
9 10/08/2016 12:05:06 2 6 
10 10/08/2016 12:05:07 3 4 
11 10/08/2016 12:05:08 3 2 

Значения в колонке ['A'] повтора в течение долгого времени, мне нужен столбец, хотя, где у них есть новый идентификатор каждый раз, когда они меняются, так что я бы что-то вроде следующий df

print(df) 
       DATE_TIME A B C 
0 10/08/2016 12:04:56 1 5 1 
1 10/08/2016 12:04:58 1 6 1 
2 10/08/2016 12:04:59 2 3 2 
3 10/08/2016 12:05:00 2 2 2 
4 10/08/2016 12:05:01 3 4 3 
5 10/08/2016 12:05:02 3 6 3 
6 10/08/2016 12:05:03 1 3 4 
7 10/08/2016 12:05:04 1 2 4 
8 10/08/2016 12:05:05 2 4 5 
9 10/08/2016 12:05:06 2 6 5 
10 10/08/2016 12:05:07 3 4 6 
11 10/08/2016 12:05:08 3 2 6 

есть ли способ сделать это с помощью Python? Я все еще очень новичок в этом и надеялся найти что-то, что могло бы помочь мне в пандах, но я еще ничего не нашел. В моем исходном фреймворке значения в столбце ['A'] изменяются на нерегулярные интервалы примерно каждые десять минут, а не каждые две строки, как в моем примере. Кто-нибудь знает, как я мог бы подойти к этой задаче? Спасибо

ответ

5

Вы можете использовать шаблон shift-cumsum.

df['C'] = (df.A != df.A.shift()).cumsum() 

>>> df 
       DATE_TIME A B C 
0 10/08/2016 12:04:56 1 5 1 
1 10/08/2016 12:04:58 1 6 1 
2 10/08/2016 12:04:59 2 3 2 
3 10/08/2016 12:05:00 2 2 2 
4 10/08/2016 12:05:01 3 4 3 
5 10/08/2016 12:05:02 3 6 3 
6 10/08/2016 12:05:03 1 3 4 
7 10/08/2016 12:05:04 1 2 4 
8 10/08/2016 12:05:05 2 4 5 
9 10/08/2016 12:05:06 2 6 5 
10 10/08/2016 12:05:07 3 4 6 
11 10/08/2016 12:05:08 3 2 6 

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

df.groupby((df.A != df.A.shift()).cumsum()).B.mean() 
+0

wow! это очень полезно! – vera

+0

Вот что я собирался попытаться сделать «вручную». Приятно о кумулятивной суммирующей функции. – beroe