Подсчитать количество событий в зависимости от состояния и сохранить в новом столбце - PullRequest
3 голосов
/ 27 сентября 2019

Я относительно новичок в пандах / питонах.У меня есть список имен и дат.Я хочу сгруппировать записи по Имени и посчитать количество Имен для «после 2016 года» и «до 2016 года».Счет должен быть добавлен в новый столбец.

Мой ввод:

Name    Date
Marc    2006
Carl    2003
Carl    2002
Carl    1990
Marc    1999
Max     2016
Max     2014
Marc    2006
Carl    2003
Carl    2002
Carl    2019
Marc    1999
Max     2016
Max     2014

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

      Before
      2016  Count
Marc    1    4
Marc    0    0
Carl    1    5
Carl    0    1
Max     1    2
Max     0    2

Таким образом, вывод долженесть 2 записи для каждого Имени, одна с количеством Имен до 2016 года и одна после.Кроме того, столбец, в котором только статистика 1 до 2016 года и 0 после.

Как уже упоминалось ранее, я довольно новичок.Я смог посчитать записи с условием года:

df.groupby('Name')['Date'].apply(lambda x: (x<'2016').sum()).reset_index(name='count')

Но, честно говоря, я не совсем уверен, что делать дальше.Может быть, кто-то может указать мне правильное направление.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2019

Из того, что я понимаю, вам нужно заполнить оба поля 1 и 0 для каждого имени, попробуйте с помощью pivot_table с df.unstack():

(df.assign(Before=df['Date'].lt(2016).view('i1'))
 .pivot_table('Date','Name','Before',aggfunc='count',fill_value=0).unstack()
 .sort_index(level=1).reset_index(0,name='Count'))

       Before  Count
Name               
Carl       0      1
Carl       1      5
Marc       0      0
Marc       1      4
Max        0      2
Max        1      2
2 голосов
/ 27 сентября 2019

Вы можете передать apply функцию, которая возвращает фрейм данных 2x2.Примерно так:

def counting(x):
    bef = (x < 2016).sum()
    aft = (x > 2016).sum()
    return pd.DataFrame([[1, bef], [0, aft]], index=[x.name, x.name], columns=["before 2016", "Count"])

ddf = df.groupby('Name')['Date'].apply(counting).reset_index(level=0, drop=True)

ddf это:

      before 2016  Count
Carl            1      5
Carl            0      1
Marc            1      4
Marc            0      0
Max             1      2
Max             0      0
2 голосов
/ 27 сентября 2019

Вы можете группировать по внешнему ряду, имеющему ту же длину, что и кадр данных:

s = df['Date'].lt(2016).astype('int')
s.name = 'Before 2016'

df.groupby(['Name', s]).count()

Результат:

                  Date
Name Before 2016      
Carl 0               1
     1               5
Marc 1               4
Max  0               2
     1               2

lt означает «меньше чем».Другие функции сравнения: le (меньше или равно), gt (больше чем), ge (больше или равно) и eq (равно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...