为了账号安全,请及时绑定邮箱和手机立即绑定

如何计算数据框中每一行去年发生的案例数?

如何计算数据框中每一行去年发生的案例数?

青春有我 2021-12-16 15:57:38
问题是,对于同一组中的每一行,计算当前行的去年内完成的案例数。数据集 (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 和 < df['date']我试图在 python 中定义一个函数,如:# Create the dataframed = {'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 functiondef 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 yearabc      07/12/16              0abc      02/04/17              1abc      02/13/17              2abc      02/16/19              0xyz      11/03/14              0xyz      11/06/14              1xyz      02/17/16              0
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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


查看完整回答
反对 回复 2021-12-16
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我只是用稍微修改过的代码复制了你的逻辑:


....

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


查看完整回答
反对 回复 2021-12-16
  • 2 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信