【问题标题】:Pandas time-series: aggregate by day and transposePandas 时间序列:按天聚合并转置
【发布时间】:2019-08-09 05:45:23
【问题描述】:

我有以下数据框:

dataframe = pd.DataFrame({'date':pd.to_datetime(['2018-05-27', '2018-05-27','2018-05-28','2018-06-1']), 
                         'code': ['1', '1', '1', '2']})
dataframe 
    date      code
0   2018-05-27  1
1   2018-05-27  1
2   2018-05-28  1
3   2018-06-01  2

我想要:

dataframe = pd.DataFrame({'date':pd.to_datetime(['2018-05-27', '2018-05-28','2018-05-29','2018-05-30','2018-05-31', '2018-06-1']),
                          '1': [2, 1, 1, 0, 0, 0], 
                          '2': [0, 0, 0, 0, 0, 1]})
dataframe
    date        1   2
0   2018-05-27  2   0
1   2018-05-28  1   0
2   2018-05-29  0   0
3   2018-05-30  0   0
4   2018-05-31  0   0
5   2018-06-01  0   1

我的第一次尝试是:

dataframe.groupby([dataframe['code'], dataframe['date'].dt.month.rename('month'), dataframe['date'].dt.day.rename('day')]).agg({"count"})


code    month day    date count
1         5    27       2
               28       1
2         6     1       1

但是给了我两个问题:(1)日期不再是日期格式,(2)我不知道如何转置它。我一直在与 pandas 时间序列和聚合函数作斗争,但没有取得多大成功。我也想在几个月内拥有它。知道如何进行吗?

我已经检查了 StackOverflow 的以下问题。 Herehere 但不完全相同。

【问题讨论】:

  • 2018 年 5 月 29 日的 1 来自哪里?
  • 这是一个错字。谢谢。

标签: python pandas dataframe aggregate transpose


【解决方案1】:

你可以使用pd.crosstab:

pd.crosstab(dataframe['date'], dataframe['code'])\
  .reindex(pd.date_range(dataframe['date'].min(), 
                         dataframe['date'].max()), fill_value=0)

输出:

code        1  2
2018-05-27  2  0
2018-05-28  1  0
2018-05-29  0  0
2018-05-30  0  0
2018-05-31  0  0
2018-06-01  0  1

选项#2

dataframe.groupby(['date','code']).size()\
         .unstack(1, fill_value=0)\
         .reindex(pd.date_range(dataframe['date'].min(), 
                                dataframe['date'].max()), 
                  fill_value=0)

输出:

code        1  2
2018-05-27  2  0
2018-05-28  1  0
2018-05-29  0  0
2018-05-30  0  0
2018-05-31  0  0
2018-06-01  0  1

【讨论】:

  • 这真的很酷;让我想起了Series.value_counts(),但对DataFrame 很有用。谢谢!
  • @jeschwar 谢谢。
猜你喜欢
  • 2022-11-30
  • 2017-03-31
  • 2018-02-28
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多