2015-02-23 3 views
0

У меня есть dataframe, и я пытаюсь подсчитать количество людей, которые присоединились к группе по дате. Так что это:Подсчет записей по подкатегориям и дате в pandas

individual_id group_id  date 
    a    1  2000-01-01 
    a    1  2000-01-02 
    a    1  2000-01-03 
    b    1  2000-01-02 
    b    1  2000-01-04 
    c    1  2000-01-03 
    c    1  2000-01-04 
    d    2  2000-01-02 

стал бы это:

individual_id group_id  date  people_in_group 
    a    1  2000-01-01   1 
    a    1  2000-01-02   2 
    a    1  2000-01-03   3 
    b    1  2000-01-02   2 
    b    1  2000-01-04   3 
    c    1  2000-01-03   3 
    c    1  2000-01-04   3 
    d    2  2000-01-02   1 
+0

Не могли бы вы подтвердить, что это 'Panel' тип данных? Поскольку это 2-D, я бы ожидал, что это будет «DataFrame» –

+0

. Я отправил ответ, но я не думаю, что это то, что вы хотите. Я официально смущен !! Даты 2000-01-05 и 2000-01-06 появляются в исходном фрейме данных, но не в результате - можете ли вы объяснить, почему? Можете ли вы объяснить, что означают несколько строк с одинаковыми 'individual_id' и' group_id'? Я понял, что один и тот же человек несколько раз присоединялся к группе, но теперь думаю, что это может быть неправильно. –

+0

Ugg. Ужасная опечатка; так жаль! Должно быть одинаковое между этими двумя. Причина, по которой есть несколько строк, состоит в том, что это панель с несколькими наблюдениями над одним и тем же человеком. В моем наборе данных есть другие важные переменные, которые мне нужно отслеживать. Каждый индивидуум должен учитываться только один раз. В 2000-01-01 в группе есть только один человек, а в 2000-01-03 в группе три человека: a, b и c. – Luke

ответ

1

Во-первых, вы можете использовать GroupBy, чтобы узнать, сколько присоединился на каждую дату - т.е.

import pandas as pd 
from datetime import datetime 
import numpy as np 

df = pd.DataFrame({'individual_id':['a','a','a','b','b','c','c','d'], 
        'group_id':[1,1,1,1,1,1,1,2], 
        'date':[datetime(2000,01,01),datetime(2000,01,02), 
          datetime(2000,01,03),datetime(2000,01,05), 
          datetime(2000,01,06),datetime(2000,01,03), 
          datetime(2000,01,04),datetime(2000,01,02)]}) 

#df = <dataframe of your original data (mocked up above)> 
#Add a placeholder 'rowCounter' column, so that the groups are easily counted. 
df['rowCounter'] = np.ones(len(df))  
df1 = df.groupby(['individual_id','group_id','date'], as_index=False).sum() 

Тогда , используйте функцию cumsum() для их суммирования до и до даты

df1['people_in_group'] = df1.groupby(['individual_id','group_id'], as_index=False)['rowCounter'].transform(pd.Series.cumsum) 

Необязательно удалить фиктивный столбец строки счетчика, который мы создали:

df1 = df1.drop('rowCounter',1) 

Отпечаток df1 теперь показывает

individual_id group_id  date people_in_group 
0    a   1 2000-01-01    1 
1    a   1 2000-01-02    2 
2    a   1 2000-01-03    3 
3    b   1 2000-01-05    1 
4    b   1 2000-01-06    2 
5    c   1 2000-01-03    1 
6    c   1 2000-01-04    2 
7    d   2 2000-01-02    1 
+0

Спасибо. Немного смущенный этим ответом. Если вы включите «дату» в первую группу, вы получите пустой фреймворк. Может быть, вы пропустите несколько шагов. – Luke

+0

Извините - опасения о том, чтобы отбросить ответ без предварительного тестирования. Я дам более полный ответ через минуту - есть некоторые ошибки в том, что я предлагаю сделать это глупостью. –

+0

На самом деле - только что понял, что я неправильно понял вопрос - я мог бы опубликовать то, во что я ехал, но я больше не думаю, что это то, что вы хотите. Я запрошу разъяснения в комментарии по оригинальному вопросу. –

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