我有一个包含大量观察结果的数据框:
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
我虽然按colour
和date
订购数据框,然后尝试重新编制索引。
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
答案 0 :(得分:5)
从您的示例数据框开始:
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
如果你想重新索引'date'和'color',一种可能性就是将两者都设置为索引(多索引):
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')
这更简单,但是这并不能为您提供每种颜色的完整日期范围,只提供该颜色组可用的日期范围。