如果缺少某些列值,则创建 df 行的新实例

Make new instances of a df row if certain column value is missing

我在 python 中有这样一个 df:

ID Report Date
1 1/1/2021
1 2/1/2021
1 3/1/2021
2 NaN
2 12/1/2021
3 NaN
3 NaN

有些 ID 包含报告日期的所有 12 个月,有些有几个,有些有 none 与之关联。我想做的是让这个例子 df 看起来像:

ID Report Date
1 1/1/2021
1 2/1/2021
1 3/1/2021
1 4/1/2021
1 5/1/2021
1 6/1/2021
1 7/1/2021
1 8/1/2021
1 9/1/2021
1 10/1/2021
1 11/1/2021
1 12/1/2021
2 1/1/2021
2 2/1/2021
2 3/1/2021
2 4/1/2021
2 5/1/2021
2 6/1/2021
2 7/1/2021
2 8/1/2021
2 9/1/2021
2 10/1/2021
2 11/1/2021
2 12/1/2021
3 1/1/2021
3 2/1/2021
3 3/1/2021
3 4/1/2021
3 5/1/2021
3 6/1/2021
3 7/1/2021
3 8/1/2021
3 9/1/2021
3 10/1/2021
3 11/1/2021
3 12/1/2021

其中每个 ID 有 12 个实例。此数据框还附加了其他数据,但为简单起见,我只显示了这两列。非常感谢任何帮助。

更新:所以只是想澄清一下,这可以使用字典和 for 循环来完成,但想知道是否有更简单的 pandas 函数。谢谢!

你可以试试这个:

import pandas as pd

NUMBER_OF_IDS = 3
YEAR = 2021

df = pd.DataFrame(
    {
        "ID": [
            item
            for sublist in [[i + 1 for _ in range(12)] for i in range(NUMBER_OF_IDS)]
            for item in sublist
        ],
        "Report Date": [
            report_date.strftime("%m/%d/%Y")
            for report_date in pd.date_range(
                start=f"1/1/{YEAR}", end=f"12/31/{YEAR}", freq="MS"
            )
        ]
        * NUMBER_OF_IDS,
    }
)

提供了想要的结果:

print(df)

# Output
    ID Report Date
0    1  01/01/2021
1    1  02/01/2021
2    1  03/01/2021
3    1  04/01/2021
4    1  05/01/2021
5    1  06/01/2021
6    1  07/01/2021
7    1  08/01/2021
8    1  09/01/2021
9    1  10/01/2021
10   1  11/01/2021
11   1  12/01/2021
12   2  01/01/2021
13   2  02/01/2021
14   2  03/01/2021
15   2  04/01/2021
16   2  05/01/2021
17   2  06/01/2021
18   2  07/01/2021
19   2  08/01/2021
20   2  09/01/2021
21   2  10/01/2021
22   2  11/01/2021
23   2  12/01/2021
24   3  01/01/2021
25   3  02/01/2021
26   3  03/01/2021
27   3  04/01/2021
28   3  05/01/2021
29   3  06/01/2021
30   3  07/01/2021
31   3  08/01/2021
32   3  09/01/2021
33   3  10/01/2021
34   3  11/01/2021
35   3  12/01/2021