熊猫如何填充缺失的行

时间:2021-03-30 14:50:55

标签: pandas dataframe

我有一个类似的数据集:

Dept, Date, Number
dept1, 2020-01-01, 12
dept1, 2020-01-03, 34
dept2, 2020-01-03, 56
dept3, 2020-01-03, 78
dept2, 2020-01-04, 11
dept3, 2020-01-04, 12
...

例如,我想在 2020-01-01 日期为缺少的 dept2 和 dept3 填零

Dept, Date, Number
dept1, 2020-01-01, 12
dept2, 2020-01-01, 0   <--need to be added 
dept3, 2020-01-01, 0   <--need to be added
dept1, 2020-01-03, 34
dept2, 2020-01-03, 56
dept3, 2020-01-03, 78
dept1, 2020-01-04, 0  <--need to be added
dept2, 2020-01-04, 11
dept3, 2020-01-04, 12

换句话说,对于独特的部门,我需要在每个独特的日期显示它们。

这是实现这一目标的方法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

让我们先pivot然后stack

out = df.pivot(*df.columns).fillna(0).stack().reset_index(name='Number')
    Dept         Date  Number
0  dept1   2020-01-01    12.0
1  dept1   2020-01-03    34.0
2  dept1   2020-01-04     0.0
3  dept2   2020-01-01     0.0
4  dept2   2020-01-03    56.0
5  dept2   2020-01-04    11.0
6  dept3   2020-01-01     0.0
7  dept3   2020-01-03    78.0
8  dept3   2020-01-04    12.0

答案 1 :(得分:1)

您可以使用 complete 中的 pyjanitor 函数来抽象流程,只需传递您希望展开的列:

In [598]: df.complete(['Dept', 'Date']).fillna(0)
Out[598]: 
    Dept       Date  Number
0  dept1 2020-01-01    12.0
1  dept1 2020-01-03    34.0
2  dept1 2020-01-04     0.0
3  dept2 2020-01-01     0.0
4  dept2 2020-01-03    56.0
5  dept2 2020-01-04    11.0
6  dept3 2020-01-01     0.0
7  dept3 2020-01-03    78.0
8  dept3 2020-01-04    12.0

您也可以只使用 Pandas 并使用 reindex 方法; complete 涵盖索引不唯一或存在空值的情况;它是一个抽象/便利包装器:

(df
 .set_index(['Dept', 'Date'])
 .pipe(lambda df: df.reindex(pd.MultiIndex.from_product(df.index.levels), 
                             fill_value = 0))
 .reset_index()
 )
 
    Dept       Date  Number
0  dept1 2020-01-01      12
1  dept1 2020-01-03      34
2  dept1 2020-01-04       0
3  dept2 2020-01-01       0
4  dept2 2020-01-03      56
5  dept2 2020-01-04      11
6  dept3 2020-01-01       0
7  dept3 2020-01-03      78
8  dept3 2020-01-04      12