当前位置: 首页 > 面试题库 >

熊猫:使用groupby重新采样时间序列

东郭阳德
2023-03-14
问题内容

给定下面的熊猫DataFrame:

In [115]: times = pd.to_datetime(pd.Series(['2014-08-25 21:00:00','2014-08-25 21:04:00',
                                            '2014-08-25 22:07:00','2014-08-25 22:09:00']))
          locations = ['HK', 'LDN', 'LDN', 'LDN']
          event = ['foo', 'bar', 'baz', 'qux']
          df = pd.DataFrame({'Location': locations,
                             'Event': event}, index=times)
          df
Out[115]:
                               Event Location
          2014-08-25 21:00:00  foo   HK
          2014-08-25 21:04:00  bar   LDN
          2014-08-25 22:07:00  baz   LDN
          2014-08-25 22:09:00  qux   LDN

我想对数据重新采样以每小时计数一次,同时按位置分组以生成如下所示的数据框:

Out[115]:
                               HK    LDN
          2014-08-25 21:00:00  1     1
          2014-08-25 22:00:00  0     2

我尝试了resample()和groupby()的各种组合,但是没有运气。我将如何处理?


问题答案:

在我的原始帖子中,我建议使用pd.TimeGrouper。如今,使用pd.Grouper代替pd.TimeGrouper。语法在很大程度上是相同的,但TimeGrouper现在已不支持pd.Grouper

此外,虽然pd.TimeGrouper只能按DatetimeIndex分组,但可以按日期时间
pd.Grouper进行分组,而您可以通过参数指定。
__key

您可以使用pd.Grouper来按小时将DatetimeIndex’ed DataFrame分组:

grouper = df.groupby([pd.Grouper(freq='1H'), 'Location'])

用于count计算每个组中的事件数:

grouper['Event'].count()
#                      Location
# 2014-08-25 21:00:00  HK          1
#                      LDN         1
# 2014-08-25 22:00:00  LDN         2
# Name: Event, dtype: int64

用于unstackLocation索引级别移至列级别:

grouper['Event'].count().unstack()
# Out[49]: 
# Location             HK  LDN
# 2014-08-25 21:00:00   1    1
# 2014-08-25 22:00:00 NaN    2

然后用于fillna将NaN更改为零。

放在一起

grouper = df.groupby([pd.Grouper(freq='1H'), 'Location'])
result = grouper['Event'].count().unstack('Location').fillna(0)

产量

Location             HK  LDN
2014-08-25 21:00:00   1    1
2014-08-25 22:00:00   0    2


 类似资料:
  • 问题内容: 如何将大熊猫中的时间序列重新采样为每周从任意一天开始的每周频率?我看到有一个可选的关键字库,但它仅适用于少于一天的时间间隔。 问题答案: 您可以将锚定的偏移量传递给,以及它们涵盖此情况的其他选项。 例如,星期一的每周频率:

  • 问题内容: 为创建这个问题的重复而道歉。我有一个数据框,其形状大致如下图所示: 返回: 我将需要重新采样以得出每日滚动平均值,即应用。 我尝试了两种方法: 1 -拆垛和堆积,建议在这里 这返回一个错误 2 -使用,建议在这里 这不会返回错误,但似乎并没有适当地对df重新采样/分组。结果似乎包含每小时数据点,而不是每天: 问题答案: 首先让我们定义一个重采样函数: 然后,我们对job_id进行分组并

  • 问题内容: 我正在尝试使用具有相似列值的行来估算值。 例如,我有这个数据框 我想使用相似的列[‘one’]和[‘two’]的键,并且如果列[‘three’]并非完全是nan,则从具有相似的键的行中插值[ ‘3’] 这是我的愿望结果 您会看到键1和3不包含任何值,因为现有值不存在。 我试过使用groupby fillna() 这给了我一个错误。 我尝试了正向填充,这给了我一个相当奇怪的结果,那就是它

  • 我有一个小熊猫DataFrame我想重新取样,我希望你能帮我:) 我不能给你看,因为它是保密的,但我可以给你描述一个更简单的版本。 它有4列: -日期(YYYY-MM-DD格式) -国家 -数量 -频率 下面是我想做的: 根据行的不同,频率为每年或每月如果恰好是每月,则无需执行任何操作。 但如果是每年一次,我想将其改为每月一次,并插入11个新行,以便在考虑的12行(现有行和11个新行)中,国家将保

  • 我有一个这样的数据帧: 我想知道我们如何使用GROUPBY实现相同的结果? 感谢帮助。 类似的问题: Pandas列值到列?

  • 问题内容: 我有一个如下所示的df: 我正在尝试创建一个如下所示的df: 我试过了 但这不是我要寻找的。 任何指导表示赞赏 问题答案: 那不是新的专栏,而是新的DataFrame: 要获得想要的结果,请使用: 要获得“新列”,您可以使用transform: 我建议阅读docs的split- apply-combine部分 。