2016-04-07 3 views
0

Я пытаюсь создать увеличивающееся количество по группам числа кортежей строк.Pandas разворачивание числа строк по группам

index category   group 
2000-01-01 ('foo',)    a 
2000-01-02 ('tito', 'puente') a 
2000-01-03 ('bar',)    a 
2000-01-04 ('zip',)    b 
2000-01-05 ('zorp',)   b 
2000-01-03 ('feep',)   c 

бы стать:.

index category   group tuple_count 
2000-01-01 ('foo',)    a  0 
2000-01-02 ('tito', 'puente') a  1 
2000-01-03 ('bar',)    a  2 
2000-01-04 ('zip',)    b  0 
2000-01-05 ('zorp',)   b  0 
2000-01-03 ('feep',)   c  1 

Идея заключается в том, что я хочу, чтобы создать расширяющееся окно группы графов возникновения категорий, я интересуюсь В этом случае, интересными категориями являются [('tito', 'puente'), ('bar',), ('feep',)]. Когда появится новая категория, я хочу добавить к счету.

Я использую следующий код и не могу понять, почему он не работает

from operator import or_ 

def count_categories(ser): 

    categories_to_count = [('tito', 'puente'), 
          ('bar',), 
          ('feep',)] 

    conditions = [ser == val for val in categories_to_count] 
    mask = reduce(or_, conditions) 
    return mask.sum() 


def expanding_count_categories(s): 
    return s.expanding().apply(count_categories) 

df.groupby('group')['category'].apply(expanding_count_categories) 

Для столбца tuple_count, я просто получить столбец категории обратно:

index    tuple_count 
2000-01-01   ('foo',) 
2000-01-02   ('tito', 'puente') 
2000-01-03   ('bar',) 
2000-01-04   ('zip',) 
2000-01-05   ('zorp',) 
2000-01-03   ('feep',) 

редактирование:

Проблема, кажется, что не-числовые в настоящее время not handled by expanding/window

+0

Я не могу понять логику этого tuple_count. Почему ноль b и первый c один? – Parfait

+0

'count_categories' только учитывает появление кортежей в' categories_to_count'. В этом списке нет категорий 'b'. – Luke

ответ

0

Поскольку не-Числовые в настоящее время не обрабатываются окна, это кажется, что лучший способ сделать это, чтобы создать фиктивный первый и затем выполните текущую сумму. Преимуществом этого является то, что он также работает и на поворотных окнах.

categories_to_count = [('tito', 'puente'), 
         ('bar',), 
         ('feep',)] 

df['has_category'] = np.where(X['category'].isin(categories_to_count), 1, 0) 

df.groupby('group')['has_category'].apply(lambda x: x.expanding().sum()) 
1

Не совсем уверен в вашем расширяющемся подходе, но подумайте об использовании rank() в функции groupby apply, заказывая по датам внутри группы и проверяя категории с помощью isin(). Единственное предостережение не имеет колонки с именем индекс, который конфликтует с индекс в серии groupby, который не имеет атрибута ранга. Если вам необходимо, рассмотреть возможность создания и переименования индекса после операции подсчета кортеж:

df = pd.DataFrame({'datesix':['2000-01-01', '2000-01-02', '2000-01-03', 
          '2000-01-04', '2000-01-05', '2000-01-06'], 
        'category':[('foo',), ('tito', 'puente'), ('bar',), 
           ('zip',), ('zorp',), ('feep',)],     
        'group': ['a', 'a', 'a', 'b', 'b', 'c']}) 

df['datesix'] = pd.to_datetime(df['datesix']) 

def count_categories(ser): 
    categories_to_count = [('tito', 'puente'), 
          ('bar',), 
          ('feep',)] 

    ser['tuple_count'] = ser.datesix[(ser.category.isin(categories_to_count))].rank() 
    ser['tuple_count'] = ser['tuple_count'].fillna(0).astype(int) 
    return ser 

df = df.groupby('group').apply(count_categories) 

#   category  datesix group tuple_count 
# 0   (foo,) 2000-01-01  a   0 
# 1 (tito, puente) 2000-01-02  a   1 
# 2   (bar,) 2000-01-03  a   2 
# 3   (zip,) 2000-01-04  b   0 
# 4   (zorp,) 2000-01-05  b   0 
# 5   (feep,) 2000-01-06  c   1 
+0

Ничего себе. хороший! Я все еще пытаюсь обойти это. Почему вы используете 'dateix' для метода' rank'. Не могли бы вы использовать какой-либо столбец в месте 'dateix', пока кадр данных уже упорядочен? – Luke

+0

К сожалению, нет, 'rank()' занимает определенную переменную. См. Его с категорией и элементом, у большинства элементов есть больший результат: 0, 2, 1, 0, 0, 1 для tuple_count. – Parfait

+0

Посмотрел это чуть больше, и он не будет поддерживать подсчет из предыдущей строки, если в текущей строке нет категории интереса. – Luke

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