熊猫groupby计数天数

时间:2020-08-31 19:56:48

标签: python pandas dataframe datetime

假设我具有以下数据框:

df = pd.DataFrame({'c': ['abc', 'def', 'wyx', 'abc', 'wyx'], 'begin_date': ['2020-01-01', '2000-12-23', '2003-07-07', '2005-03-02', '2004-01-01'], 'end_date': ['2020-01-31', '2001-02-02', '2004-03-02', '2005-04-01', '2004-07-04']})

df

  c  begin_date    end_date
 abc  2020-01-01  2020-01-31
 def  2000-12-23  2001-02-02
 wyx  2003-07-07  2004-03-02
 abc  2005-03-02  2005-04-01
 wyx  2004-01-01  2004-07-04

我想按c分组并计算该行c在begin_dateend_date之间的唯一天数,我的最终数据帧将是:

end = pd.DataFrame({'c': ['abc', 'def', 'wyx'], 'count': [30, 41, 363]})

end
   c  count
 abc     30
 def     41
 wyx    363

1 个答案:

答案 0 :(得分:1)

您应该做的第一件事就是将其转换为日期时间类型,然后可以减去和分组:

s = (pd.to_datetime(df.end_date) - pd.to_datetime(df.begin_date)).dt.days
s.groupby(df['c']).sum()

更新:要删除重复的日期,我们可以重新采样

df['begin_date'] = pd.to_datetime(df['begin_date'])
df['end_date'] = pd.to_datetime(df['end_date'])

(pd.concat(pd.DataFrame({
    'c':x['c'],
    'count':pd.date_range(x.begin_date, x.end_date)
}) for _,x in df.iterrows())
   .drop_duplicates()
   .groupby('c').size()
   .reset_index(name='count')
)

输出:

     c  count
0  abc     62
1  def     42
2  wyx    364