Python数据框架:如何获取所有类别的完整日期

Python数据框架:如何获取所有类别的完整日期,python,pandas,Python,Pandas,我有这样一个熊猫数据框: import pandas as pd import numpy as np df = pd.DataFrame({ 'date': pd.to_datetime(['2021-06-06']*3 + ['2021-06-07']*3 + ['2021-06-09']*3), 'cat': ['a', 'b', 'c']*3, 'value': np.random.randn(9) }) # date cat

我有这样一个熊猫数据框:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'date': pd.to_datetime(['2021-06-06']*3 + ['2021-06-07']*3 + ['2021-06-09']*3),
    'cat': ['a', 'b', 'c']*3,
    'value': np.random.randn(9)
    })

#         date cat     value
# 0 2021-06-06   a  1.182969
# 1 2021-06-06   b  0.460896
# 2 2021-06-06   c  0.859053
# 3 2021-06-07   a  0.259080
# 4 2021-06-07   b -1.333531
# 5 2021-06-07   c  1.258963
# 6 2021-06-09   a  0.254633
# 7 2021-06-09   b  0.250557
# 8 2021-06-09   c  1.363891
我想填写date列中缺少的日期,但要填写cat列中所有唯一的值。对于值列,可以将其保留为NaN。下面的代码似乎实现了我所需要的功能,但我只是想知道是否有更简单的方法来实现同样的功能

from itertools import product

df_out = pd.DataFrame(
    product(
        pd.date_range(df.date.min(), df.date.max(), freq="D"),
        df.cat.unique()
        )
    )\
    .set_axis(["date", "cat"], axis=1)\
    .merge(df, how="left", on=["date", "cat"])
    
#          date cat     value
# 0  2021-06-06   a  1.090784
# 1  2021-06-06   b -0.479246
# 2  2021-06-06   c  1.886213
# 3  2021-06-07   a  1.477877
# 4  2021-06-07   b -0.026864
# 5  2021-06-07   c -1.432626
# 6  2021-06-08   a       NaN
# 7  2021-06-08   b       NaN
# 8  2021-06-08   c       NaN
# 9  2021-06-09   a  0.055170
# 10 2021-06-09   b -2.060127
# 11 2021-06-09   c  0.402082
我们可以旋转数据帧以将其重塑为宽格式,然后使用asfreq重新索引数据帧以填充缺失的日期,然后堆叠数据帧以将其重塑为长格式

df.pivot('date', 'cat').asfreq('D').stack(dropna=False).reset_index()

您可以使用product方法创建多索引,然后在groupby之后使用df.reindex,而不是合并。我在那里查看了答案,但说实话,我不确定如何设置多重索引,所以我将只使用@Shubham Sharma的解决方案。感谢您的努力。对于这个示例数据集,它工作得很顺利,但是出于某种原因,在我的实际用例中,asfreq'D'为value列生成了所有的NaN。你知道是什么引起的吗?现在让它工作起来,非常感谢。在真实用例中,我的日期列是一个字符串,而不是日期。老实说,我希望熊猫抛出一个错误,而不是在这种情况下产生所有的南。无论如何,感谢您提供了一个简洁的解决方案。@Jakub.Novotny请确保您已将日期列转换为datetime类型
         date cat     value
0  2021-06-06   a  1.312101
1  2021-06-06   b  0.427093
2  2021-06-06   c  0.889593
3  2021-06-07   a -0.145082
4  2021-06-07   b -0.262260
5  2021-06-07   c  0.827072
6  2021-06-08   a       NaN
7  2021-06-08   b       NaN
8  2021-06-08   c       NaN
9  2021-06-09   a  0.273335
10 2021-06-09   b -0.201577
11 2021-06-09   c -1.294582