【问题标题】:Re-index dataframe by new range of dates按新的日期范围重新索引数据框
【发布时间】:2014-12-11 11:00:06
【问题描述】:

我有一个包含许多观察的数据框:

date         colour     orders
2014-10-20   red        7
2014-10-21   red        10
2014-10-20   yellow     3

我想重新索引数据框并标准化日期。

date         colour     orders
2014-10-20   red        7
2014-10-21   red        10
2014-10-22   red        NaN
2014-10-20   yellow     3
2014-10-21   yellow     NaN
2014-10-22   yellow     NaN

我想通过colourdate 对数据框进行排序,然后尝试重新索引它。

index = pd.date_range('20/10/2014', '22/10/2014')
test_df = df.sort(['colour', 'date'], ascending=(True, True))
ts = test_df.reindex(index)
ts

但它返回一个新的数据框,索引正确,但所有 NaN 值。

date         colour     orders
2014-10-20   NaN        NaN
2014-10-21   NaN        NaN
2014-10-22   NaN        NaN

【问题讨论】:

  • 在您的示例中index 是什么?
  • 嗨 Joris,我是熊猫新手。我认为初始数据框实际上根本没有索引。我已经对它进行了排序,但没有设置任何索引。
  • 但我的意思是,您在ts = test_df.reindex(index) 行中使用了一个名为index 的变量。那到底是什么?
  • 抱歉,我已经编辑了最初的问题,但缺少那行代码。理想情况下,我会让熊猫自动找到开始和结束日期。就像数据框中的日期越来越小。我刚刚看到命令test_df.resample('D') 是为了做到这一点,但我认为我应该事先按'date'索引test_df,我正在努力解决这个问题。

标签: python pandas date-range reindex


【解决方案1】:

从您的示例数据框开始:

In [51]: df
Out[51]:
        date  colour  orders
0 2014-10-20     red       7
1 2014-10-21     red      10
2 2014-10-20  yellow       3

如果您想重新索引“日期”和“颜色”,一种可能性是将两者都设置为索引(多索引):

In [52]: df = df.set_index(['date', 'colour'])

In [53]: df
Out[53]:
                   orders
date       colour
2014-10-20 red          7
2014-10-21 red         10
2014-10-20 yellow       3

您现在可以在构建到所需索引后重新索引此数据框:

In [54]: index = pd.date_range('20/10/2014', '22/10/2014')

In [55]: multi_index = pd.MultiIndex.from_product([index, ['red', 'yellow']])

In [56]: df.reindex(multi_index)
Out[56]:
                   orders
2014-10-20 red          7
           yellow       3
2014-10-21 red         10
           yellow     NaN
2014-10-22 red        NaN
           yellow     NaN

要获得与示例输出相同的输出,索引应按第二级排序(level=1,因为它是从 0 开始的):

In [60]: df2 = df.reindex(multi_index)

In [64]: df2.sortlevel(level=1)
Out[64]:
                   orders
2014-10-20 red          7
2014-10-21 red         10
2014-10-22 red        NaN
2014-10-20 yellow       3
2014-10-21 yellow     NaN
2014-10-22 yellow     NaN

自动生成多索引的一种可能方法是(使用您的原始框架):

pd.MultiIndex.from_product([pd.date_range(df['date'].min(), df['date'].max(), freq='D'), 
                            df['colour'].unique()])

另一种方法是对每组颜色使用resample

In [77]: df = df.set_index('date')

In [78]: df.groupby('colour').resample('D')

这比较简单,但不会为您提供每种颜色的完整日期范围,只提供该颜色组可用的日期范围。

【讨论】:

  • 假设我有数千种产品(公平地说,我也没有只有一列,而是一列用于类别,各种子类别等),我该如何更改这部分代码multi_index = pd.MultiIndex.from_product([index, ['red', 'yellow']])?
  • colour 列中有很多值时,请参阅我的“自动生成多索引的可能方法...”来执行此操作
  • @Gianluca 这解决了您的问题吗?还是还有问题?
猜你喜欢
  • 2023-01-17
  • 2021-08-31
  • 1970-01-01
  • 2021-06-21
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2019-03-31
相关资源
最近更新 更多