Python 将缺少的日期时间列添加到分组的数据帧

Python 将缺少的日期时间列添加到分组的数据帧,python,pandas,Python,Pandas,是否可以将创建的日期范围中缺少的日期列添加到分组数据帧df,而不使用for循环,并将零填充为缺少的值? 日期范围有7个日期元素。df有4个日期列。那么,如何向df添加3个缺少的列呢 import pandas as pd from datetime import datetime start = datetime(2018,6,4, ) end = datetime(2018,6,10,) date_range = pd.date_range(start=start, end=end, fre

是否可以将创建的日期范围中缺少的日期列添加到分组数据帧df,而不使用for循环,并将零填充为缺少的值? 日期范围有7个日期元素。df有4个日期列。那么,如何向df添加3个缺少的列呢

import pandas as pd
from datetime import datetime

start = datetime(2018,6,4, )
end = datetime(2018,6,10,)
date_range = pd.date_range(start=start, end=end, freq='D')

DatetimeIndex(['2018-06-04', '2018-06-05', '2018-06-06', '2018-06-07',
               '2018-06-08', '2018-06-09', '2018-06-10'],
              dtype='datetime64[ns]', freq='D')

df = pd.DataFrame({
'date': 
    ['2018-06-07', '2018-06-10', '2018-06-09','2018-06-09',
    '2018-06-08','2018-06-09','2018-06-08','2018-06-10',
    '2018-06-10','2018-06-10',],
'name':
    ['sogan', 'lyam','alex','alex',
    'kovar','kovar','kovar','yamo','yamo','yamo',]
})
df['date'] = pd.to_datetime(df['date'])

df = (df
      .groupby(['name', 'date',])['date',]
      .count()
      .unstack(fill_value=0)
)

df

    date    date    date    date
date    2018-06-07 00:00:00 2018-06-08 00:00:00 2018-06-09 00:00:00 2018-06-10 00:00:00
name                
alex    0   0   2   0
kovar   0   2   1   0
lyam    0   0   0   1
sogan   1   0   0   0
yamo    0   0   0   3

我将旋转表格,使日期列成为行,然后使用pandas的.asfreq函数,如下所示:

DataFrame.asfreq(freq,method=None,how=None,normalize=False,fill\u value=None)

资料来源:

我将旋转表格,使日期列成为行,然后使用pandas的.asfreq函数,如下所示:

DataFrame.asfreq(freq,method=None,how=None,normalize=False,fill\u value=None)

资料来源:
感谢Sina Shabani提供将日期列作为行的线索。在这种情况下,更适合将日期设置为索引并使用.reindex

df = (df.groupby(['date', 'name'])['name']
        .size()
        .reset_index(name='count')
        .pivot(index='date', columns='name', values='count')
        .fillna(0))

df

name    alex    kovar   lyam    sogan   yamo
date                    
2018-06-07  0.0 0.0 0.0 1.0 0.0
2018-06-08  0.0 2.0 0.0 0.0 0.0
2018-06-09  2.0 1.0 0.0 0.0 0.0
2018-06-10  0.0 0.0 1.0 0.0 3.0

df.index = pd.DatetimeIndex(df.index)

df = (df.reindex(pd.date_range(start, freq='D', periods=7), fill_value=0)
        .sort_index())
df

name    alex    kovar   lyam    sogan   yamo
2018-06-04  0.0 0.0 0.0 0.0 0.0
2018-06-05  0.0 0.0 0.0 0.0 0.0
2018-06-06  0.0 0.0 0.0 0.0 0.0
2018-06-07  0.0 0.0 0.0 1.0 0.0
2018-06-08  0.0 2.0 0.0 0.0 0.0
2018-06-09  2.0 1.0 0.0 0.0 0.0
2018-06-10  0.0 0.0 1.0 0.0 3.0

df.T
    date    2018-06-07 00:00:00 2018-06-08 00:00:00 2018-06-09 00:00:00 2018-06-10 00:00:00
name                
alex    0.0 0.0 2.0 0.0
kovar   0.0 2.0 1.0 0.0
lyam    0.0 0.0 0.0 1.0
sogan   1.0 0.0 0.0 0.0
yamo    0.0 0.0 0.0 3.0

感谢Sina Shabani提供将日期列作为行的线索。在这种情况下,更适合将日期设置为索引并使用.reindex

df = (df.groupby(['date', 'name'])['name']
        .size()
        .reset_index(name='count')
        .pivot(index='date', columns='name', values='count')
        .fillna(0))

df

name    alex    kovar   lyam    sogan   yamo
date                    
2018-06-07  0.0 0.0 0.0 1.0 0.0
2018-06-08  0.0 2.0 0.0 0.0 0.0
2018-06-09  2.0 1.0 0.0 0.0 0.0
2018-06-10  0.0 0.0 1.0 0.0 3.0

df.index = pd.DatetimeIndex(df.index)

df = (df.reindex(pd.date_range(start, freq='D', periods=7), fill_value=0)
        .sort_index())
df

name    alex    kovar   lyam    sogan   yamo
2018-06-04  0.0 0.0 0.0 0.0 0.0
2018-06-05  0.0 0.0 0.0 0.0 0.0
2018-06-06  0.0 0.0 0.0 0.0 0.0
2018-06-07  0.0 0.0 0.0 1.0 0.0
2018-06-08  0.0 2.0 0.0 0.0 0.0
2018-06-09  2.0 1.0 0.0 0.0 0.0
2018-06-10  0.0 0.0 1.0 0.0 3.0

df.T
    date    2018-06-07 00:00:00 2018-06-08 00:00:00 2018-06-09 00:00:00 2018-06-10 00:00:00
name                
alex    0.0 0.0 2.0 0.0
kovar   0.0 2.0 1.0 0.0
lyam    0.0 0.0 0.0 1.0
sogan   1.0 0.0 0.0 0.0
yamo    0.0 0.0 0.0 3.0

感谢您提供关于日期列为行的提示。感谢您提供关于日期列为行的提示。