我希望代码检查数据帧是否包含period_list的所有元素。如果不是,我想将该元素添加到数据帧中,那么与该元素相关联的值将为零。我写了这个,但没用数据帧:test_1
Period A B C
0 2018 - Q2 1 0 1
1 2018 - Q3 1 1 1
2 2018 - Q4 0 1 1
3 2019 - Q1 0 0 0
4 2019 - Q2 0 0 1
5 2019 - Q3 1 0 1
6 2019 - Q4 0 1 1
7 2020 - Q1 1 0 1
8 2020 - Q2 0 0 0
我的代码
period_list = ['2018 - Q1', '2018 - Q2', '2018 - Q3', '2018 - Q4', '2019 - Q1', '2019 - Q2', '2019 - Q3', '2019 - Q4', '2020 - Q1', '2020 - Q2', '2020 - Q3', '2020 - Q4', '2021 - Q1']
for row in period_list:
if row not in test_1.iloc[:, 0]:
test_1.append(row)
尝试使用set_index
+reindex
+reset_index
:
df = df.set_index('Period').reindex(period_list, fill_value=0).reset_index()
df
:
Period A B C
0 2018 - Q1 0 0 0
1 2018 - Q2 1 0 1
2 2018 - Q3 1 1 1
3 2018 - Q4 0 1 1
4 2019 - Q1 0 0 0
5 2019 - Q2 0 0 1
6 2019 - Q3 1 0 1
7 2019 - Q4 0 1 1
8 2020 - Q1 1 0 1
9 2020 - Q2 0 0 0
10 2020 - Q3 0 0 0
11 2020 - Q4 0 0 0
12 2021 - Q1 0 0 0
使用的数据帧和列表:
import pandas as pd
df = pd.DataFrame({'Period': ['2018 - Q2', '2018 - Q3', '2018 - Q4',
'2019 - Q1', '2019 - Q2', '2019 - Q3',
'2019 - Q4', '2020 - Q1', '2020 - Q2'],
'A': [1, 1, 0, 0, 0, 1, 0, 1, 0],
'B': [0, 1, 1, 0, 0, 0, 1, 0, 0],
'C': [1, 1, 1, 0, 1, 1, 1, 1, 0]})
period_list = ['2018 - Q1', '2018 - Q2', '2018 - Q3', '2018 - Q4', '2019 - Q1',
'2019 - Q2', '2019 - Q3', '2019 - Q4', '2020 - Q1', '2020 - Q2',
'2020 - Q3', '2020 - Q4', '2021 - Q1']
使用df.merge()
对索引进行右联接会自动执行此操作,每次按索引合并两个数据帧:
df.merge(pd.DataFrame(index=period_list), left_index=True, right_index=True, how='right')
A B C
2018 - Q1 NaN NaN NaN
2018 - Q2 1.0 0.0 1.0
2018 - Q3 1.0 1.0 1.0
2018 - Q4 0.0 1.0 1.0
2019 - Q1 0.0 0.0 0.0
2019 - Q2 0.0 0.0 1.0
2019 - Q3 1.0 0.0 1.0
2019 - Q4 0.0 1.0 1.0
2020 - Q1 1.0 0.0 1.0
2020 - Q2 0.0 0.0 0.0
2020 - Q3 NaN NaN NaN
2020 - Q4 NaN NaN NaN
2021 - Q1 NaN NaN NaN
然后,正如@anky所写,您希望.fillna(0,downcast='infer')
将NaNs转换为0s,并从float向下转换为integer:
A B C
2018 - Q1 0 0 0
2018 - Q2 1 0 1
2018 - Q3 1 1 1
2018 - Q4 0 1 1
2019 - Q1 0 0 0
2019 - Q2 0 0 1
2019 - Q3 1 0 1
2019 - Q4 0 1 1
2020 - Q1 1 0 1
2020 - Q2 0 0 0
2020 - Q3 0 0 0
2020 - Q4 0 0 0
2021 - Q1 0 0 0