2014-01-08 3 views
1

Я пытаюсь создать список по возрастанию целых чисел по группам в панд:Создать восходящий ряд целых чисел группы в панд

Group Date 
    A  2000-01-01 
    A  2000-01-12 
    A  2000-01-15 
    A  2000-10-01 
    B  2005-02-05 
    B  2006-04-10 
    B  2010-08-20 

стал бы это:

Group Date   obs_num 
    A  2000-01-01  1 
    A  2000-01-12  2 
    A  2000-01-15  3 
    A  2000-10-01  4 
    B  2005-02-05  1 
    B  2006-04-10  2 
    B  2010-08-20  3 

ответ

4

Вы также можете сделать что-то пятно с cumsum, такие как:

df['obs_num'] = 1 
df['obs_num'] = df.groupby('Group')['obs_num'].cumsum() 

Мой маленький тест имел эту версию, как 6 мс против 14.8 ms для решения Тома.

+0

Мне это нравится. Очень умно! – TomAugspurger

+0

Это то, что новый метод вычисляет в 0.13 – Jeff

2

Я думаю, что это будет работа для вас. Мне нужно проверить небольшую деталь.

Начните с сброса индекса. Похоже, что при группировке по уровню (по индексу) порядок не сохраняется.

In [31]: df 
Out[31]: 
      Date 
Group    
A  2000-01-01 
A  2000-01-12 
A  2000-01-15 
A  2000-10-01 
B  2005-02-05 
B  2006-04-10 
B  2010-08-20 

[7 rows x 1 columns] 

In [32]: df = df.reset_index() 

Теперь это просто один лайнер:

In [42]: df['obs_num'] = df.groupby('Group').transform(lambda x: np.arange(1, len(x) + 1)) 

In [43]: df 
Out[43]: 
    Group  Date obs_num 
0  A 2000-01-01  1 
1  A 2000-01-12  2 
2  A 2000-01-15  3 
3  A 2000-10-01  4 
4  B 2005-02-05  1 
5  B 2006-04-10  2 
6  B 2010-08-20  3 

[7 rows x 3 columns] 
+0

Спасибо. Получение ValueError: неправильное количество переданных элементов 1, индексы подразумевают 22 – Luke

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