Как подсчитать количество случаев, имевших место в прошлом году, для каждой строки в кадре данных? - PullRequest
0 голосов
/ 26 марта 2019

Вопрос состоит в том, чтобы для каждой строки в одной группе подсчитывать количество дел, которые были выполнены в течение последнего года текущей строки.

Набор данных (df) выглядит следующим образом:

ID         Date    
abc      07/12/16    
abc      02/04/17   
abc      02/13/17    
abc      02/16/19    
xyz      11/03/14  
xyz      11/06/14    
xyz      02/17/16

Моя мысль: сначала создать столбец lastyr: df ['date'] - timedelta (days = 365));затем сравните каждую строку со всей группой, посчитайте, сколько даты в группе> = lastyr и

Я пытался определить функцию в python, например:

# Create the dataframe
d = {'ID': ['abc', 'abc', 'abc', 'abc', 'xyz', 'xyz', 'xyz'], 
     'Date': ['07/12/16', '02/04/17', '02/13/17', '02/16/19', '11/03/14', '11/06/14', '02/17/16']} 
df = pd.DataFrame(data=d)
df['Date'] = df['Date'].apply(pd.to_datetime)

df_1 = df 
# df_1 is same as df. I tried to compare each row in df to whole column in df_1.

# Define and apply the function
def lastyear(row):
    curr = row['Date']
    lastyr = curr - datetime.timedelta(days=365)
    if df['ID'] == df_1['ID']: # The compare is for same ID.
        return (df_1['Date'] < curr) & (df_1['Date'] >= lastyr)

df.apply(lastyear, axis=1).groupby(['ID']).count()

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

Желаемый результат будет:

Group      Date       Count # of cases happened in last year

abc      07/12/16              0
abc      02/04/17              1
abc      02/13/17              2
abc      02/16/19              0
xyz      11/03/14              0
xyz      11/06/14              1
xyz      02/17/16              0

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я только что скопировал вашу логику с немного измененным кодом:

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

def lastyear(row):
    curr = row.Date
    lastyr = curr - pd.Timedelta(days=365)
    return (df[(df.ID == row.ID) & (df.Date > lastyr) & (df.Date < curr)]).ID.size

df['Count'] = df.apply(lastyear, axis=1)
df
#Out[79]: 
#    ID       Date  Count
#0  abc 2016-07-12      0
#1  abc 2017-02-04      1
#2  abc 2017-02-13      2
#3  abc 2019-02-16      0
#4  xyz 2014-11-03      0
#5  xyz 2014-11-06      1
#6  xyz 2016-02-17      0
0 голосов
/ 26 марта 2019

IIUC, это мой ответ:

df['Date'] = pd.to_datetime(df.Date)
df['delta'] = df.groupby('ID')['Date'].diff().dt.days
df['flag'] = (df.groupby('ID').delta.cumsum()<365).astype(int)
group_ids = df.flag.diff().ne(0).cumsum()
df['count'] = df['flag'].groupby([df['ID'], group_ids]).cumsum()

Результат: (отбрасывая ненужные столбцы)

    ID       Date  count
0  abc 2016-07-12      0
1  abc 2017-02-04      1
2  abc 2017-02-13      2
3  abc 2019-02-16      0
4  xyz 2014-11-03      0
5  xyz 2014-11-06      1
6  xyz 2016-02-17      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...