【问题标题】:Python pandas pivot table between range of dates日期范围之间的Python熊猫数据透视表
【发布时间】:2019-07-23 20:02:35
【问题描述】:

我正在尝试使用以下示例 df 计算 Profile-GeographicalZone-Town 的每个组合每天的数量总和:

df = pd.DataFrame({
'Profile': {0: 'P014', 1: 'P014', 2: 'P012', 3: 'P012', 4: 'P012', 5: 'P012', 6: 'P012', 7: 'P012', 8: 'P012', 9: 'P012'},
'GeogaphicalZone': {0: 'NORTH', 1: 'NORTH', 2: 'NORTH', 3: 'SOUTH', 4: 'SOUTH',      5: 'SOUTH', 6: 'NORTH', 7: 'NORTH', 8: 'NORTH', 9: 'NORTH'},
'Town': {0: 'LONDON', 1: 'LONDON', 2: 'MANCHESTER', 3: 'MANCHESTER', 4: 'MANCHESTER', 5: 'MANCHESTER', 6: 'LIVERPOOL', 7: 'LIVERPOOL', 8: 'LIVERPOOL', 9: 'LONDON'},
'Quantity': {0: 8.202, 1: 8.202, 2: 8.202, 3: 60.645, 4: 60.645, 5: 60.645, 6: 90.925, 7: 162.373, 8: 45.095, 9: 78.832},
'StartDate': {0: '01/02/2019', 1: '01/01/2019', 2: '01/12/2018', 3: '01/11/2018', 4: '01/10/2018', 5: '01/09/2018', 6: '01/08/2018', 7: '01/07/2018', 8: '01/06/2018', 9: '01/05/2018'},
'EndDate': {0: '01/04/2020', 1: '01/05/2020', 2: '01/06/2020', 3: '01/07/2020', 4: '01/08/2020', 5: '01/09/2020', 6: '01/10/2020', 7: '01/11/2020', 8: '01/12/2020', 9: '01/01/2021'}
    }

假设开始日期和结束日期之间的每一天的数量都相同

现在我想要的输出是每个组合的 min(StartDate) 和 max(EndDate) 之间的每个 Profile-GeographicalZone-Town 的 Quantity 总和。

例如,对于 P014-NORTH-LONDON 组合,如果我只显示 2019 年 1 月/2 月的日子,我希望有这样的东西:

我认为我应该使用带有 pandas 的数据透视表,但我不确定应该如何处理我的 Start/EndDate 计算。

我可以做第一个操作,创建一个单独的 df,在 Start/EndDate 之间的所有日子里重复数量,然后应用一个数据透视表,但我认为这不是非常 Pythonic 也不是有效的。我觉得熊猫有一些很适合的东西。

这可能吗?

谢谢

【问题讨论】:

  • 看起来更像resample

标签: python pandas dataframe pivot-table


【解决方案1】:

将其分解为每日生成一个非常长的数据框,但您可以这样做:

df = pd.DataFrame({
'Profile': {0: 'P014', 1: 'P014', 2: 'P012', 3: 'P012', 4: 'P012', 5: 'P012', 6: 'P012', 7: 'P012', 8: 'P012', 9: 'P012'},
'GeogaphicalZone': {0: 'NORTH', 1: 'NORTH', 2: 'NORTH', 3: 'SOUTH', 4: 'SOUTH',      5: 'SOUTH', 6: 'NORTH', 7: 'NORTH', 8: 'NORTH', 9: 'NORTH'},
'Town': {0: 'LONDON', 1: 'LONDON', 2: 'MANCHESTER', 3: 'MANCHESTER', 4: 'MANCHESTER', 5: 'MANCHESTER', 6: 'LIVERPOOL', 7: 'LIVERPOOL', 8: 'LIVERPOOL', 9: 'LONDON'},
'Quantity': {0: 8.202, 1: 8.202, 2: 8.202, 3: 60.645, 4: 60.645, 5: 60.645, 6: 90.925, 7: 162.373, 8: 45.095, 9: 78.832},
'StartDate': {0: '01/02/2019', 1: '01/01/2019', 2: '01/12/2018', 3: '01/11/2018', 4: '01/10/2018', 5: '01/09/2018', 6: '01/08/2018', 7: '01/07/2018', 8: '01/06/2018', 9: '01/05/2018'},
'EndDate': {0: '01/04/2020', 1: '01/05/2020', 2: '01/06/2020', 3: '01/07/2020', 4: '01/08/2020', 5: '01/09/2020', 6: '01/10/2020', 7: '01/11/2020', 8: '01/12/2020', 9: '01/01/2021'}
})

df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])

dates = df.apply(lambda row: pd.date_range(row['StartDate'], row['EndDate']).to_series(), axis=1) \
            .stack() \
            .droplevel(-1)
dates.name = 'Date'

df = df.join(dates)

【讨论】:

  • 我需要的不是这样的每天数量,我在开始/结束日期之间的所有日子里都需要它。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 2017-01-13
  • 2021-02-28
  • 2023-01-11
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多