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