检查特定列中缺少的行,然后将其添加到数据帧中



我希望代码检查数据帧是否包含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

相关内容

最新更新