如果缺少某些列值,则创建 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
我在 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