【问题标题】:Python Dataframe: grouping by date and summing by typePython Dataframe:按日期分组并按类型求和
【发布时间】:2020-08-25 10:17:36
【问题描述】:

我有一个数据框,我想按日期(每天或每周)分组,以及两个不同类别的总和

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'])

【问题讨论】:

  • 这看起来适合 pivot, pd.pivot_table(df,index=["Date"],values=["Sales ($)"],columns=["Name"],aggfunc=[sum]).fillna(0.0)
  • 那么...它有用/有帮助吗?

标签: python dataframe pandas-groupby


【解决方案1】:

第一组'Date''Name'

df.groupby(['Date', 'Name']).sum().unstack(-1).replace(
    np.nan, 0).droplevel(axis=1, level=0)

然后获取sumunstack 将名称(在最后一个索引级别)设置为列,replace np.nan 带有零,最后 droplevel'Sales ($)' 从列中删除-MultiIndex

结果如下:

# 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

并使用此分组器来获取您的每周/每月分组:

df.groupby([date_grouper, 'Name']).sum().unstack(-1).replace(
    np.nan, 0).droplevel(axis=1, level=0)

当然,用新的 datetime 日期替换 'Date' 列也可以将其设置为索引。但是在将其设置为索引时,您必须省略访问dt 属性,f.i. date_grouper = df.index.week

将日期解析为datetime 还允许使用其他groupers,例如daydayofweekdayofyearhourminutesecondweekday...

【讨论】:

  • 太好了,谢谢。是否有可能更进一步——当我有几个月和几个月的数据时,我可以做同样的事情,但按周或月分组吗?例如。使用 Grouper 功能?
  • 不客气!当然,这应该很容易。您能否在您的问题中添加一些用于每月分组的示例数据?
【解决方案2】:

这应该适合你:

df.groupby(['Date','Name']).sum().reset_index()

如果您想添加每周、每天的频率,首先将您的日期列转换为 datetime : df['Date'] = pd.to_datetime(df['Date']) 然后你可以在这里添加你的频率(W 每周和D每天..)

df.groupby([pd.Grouper(key="Date", freq="D"),'Name']).sum().reset_index()

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多