Python数据框架:按日期分组和按类型求和
我有一个数据框架,我想根据日期(每天或每周)进行分组,并将两个不同类别的总数相加Python数据框架:按日期分组和按类型求和,python,dataframe,pandas-groupby,Python,Dataframe,Pandas Groupby,我有一个数据框架,我想根据日期(每天或每周)进行分组,并将两个不同类别的总数相加 data = {'Date' : ['2020-08-20','2020-08-20','2020-08-21','2020-08-21', '2020-08-22','2020-08-22'], 'Name' : ['Ben','Ben','Ben','Sam','Sam','Sam'], 'Sales ($)' : [10,5,2,5,6,7] }
data = {'Date' : ['2020-08-20','2020-08-20','2020-08-21','2020-08-21',
'2020-08-22','2020-08-22'],
'Name' : ['Ben','Ben','Ben','Sam','Sam','Sam'],
'Sales ($)' : [10,5,2,5,6,7]
}
df=pd.DataFrame(data, columns = ['Date','Name','Sales ($)'])
所以它看起来像这样:
grouped_data = {'Date' : ['2020-08-20','2020-08-21','2020-08-22'],
'Ben' : [15,2,0],
'Sam' : [0,5,13],
}
df=pd.DataFrame(grouped_data, columns = ['Date','Ben','Sam'])
这应该适合您:
df.groupby(['Date','Name']).sum().reset_index()
如果要添加每周、每日频率,请首先将日期列转换为日期时间:
df['Date']=pd.to_datetime(df['Date'])
然后,您可以在此处添加频率(W
用于每周,D
用于每天..)
df.groupby([pd.Grouper(key=“Date”,freq=“D”),'Name']).sum().reset_index()
第一个groupby'Date'
和'Name'
df.groupby(['Date', 'Name']).sum().unstack(-1).replace(
np.nan, 0).droplevel(axis=1, level=0)
然后获取和
unstack
将名称(在最后一个索引级别)设置为列,将np.nan
替换为零,最后将droplevel
从列中删除'Sales($)
结果如下:
# Out:
Name Ben Sam
Date
2020-08-20 15.0 0.0
2020-08-21 2.0 5.0
2020-08-22 0.0 13.0
假设您希望按周或月进行分组,我建议将'Date'
列解析为datetime
:
df['Date_dt'] = pd.to_datetime(df['Date'])
现在,您可以每周或每月提取约会石斑鱼:
# weekly grouper
date_grouper = df['Date_dt'].dt.week
# monthly grouper
date_grouper = df['Date_dt'].dt.month
并使用此grouper获得每周/每月分组:
df.groupby([date_grouper, 'Name']).sum().unstack(-1).replace(
np.nan, 0).droplevel(axis=1, level=0)
当然,将'Date'
列替换为新的datetime日期也可以将其设置为索引。但是当将其设置为索引时,您必须忽略访问dt
属性,f.i.date\u gropper=df.index.week
将日期解析为datetime
还允许使用其他分组,例如day
,dayofweek
,dayofyear
,hour
,minute
,second
,这是一项工作,pd.pivot\u表(df,index=[“date”],value=[“Sales($)”),columns=[“Name”],aggfunc=[sum])。fillna(0.0)
So。。。有用吗?太好了,谢谢。是否可以更进一步——当我有一个月又一个月的数据时,我可以做同样的事情,但按周或月分组吗?使用Grouper功能?不客气!当然,那应该很容易。你能在你的问题中添加一些每月分组的样本数据吗?