用字典值在df中插入缺失的行



你好,我有以下数据帧

df = pd.DataFrame(data={'grade_1':['A','B','C'],
'grade_1_count': [19,28,32], 
'grade_2': ['pass','fail',np.nan],
'grade_2_count': [39,18, np.nan]})

,其中一些成绩缺失,需要根据该字典

中的值插入到grade_n列中。
grade_dict = {'grade_1':['A','B','C','D','E','F'],
'grade_2' : ['pass','fail','not present', 'borderline']}

和_count列中对应的行值应该用np.nan填充所以预期的输出是这样的

expected_df = pd.DataFrame(data={'grade_1':['A','B','C','D','E','F'],
'grade_1_count': [19,28,32,0,0,0], 
'grade_2': ['pass','fail','not preset','borderline', np.nan, np.nan],
'grade_2_count': [39,18,0,0,np.nan,np.nan]})
到目前为止,我有这个相当不优雅的代码,它创建了一个列,其中包括所有正确的等级类别,但我不能将其重新插入到数据框架中,或者用填充计数列(其中np。nan只是反映空单元格由于强制列与不同的行长度)我希望这是有意义的。任何建议都很好。由于
x=[]
for k, v in grade_dict.items():

out = df[k].reindex(grade_dict[k], axis=0, fill_value=0)

x = pd.concat([out], axis=1)
x[k] = x.index
x = x.reset_index(drop=True)
df[k] = x.fillna(np.nan)

下面是使用两个连续合并的解决方案:

# set up combinations
from itertools import zip_longest
df2 = pd.DataFrame(list(zip_longest(*grade_dict.values())), columns=grade_dict)
# merge
(df2.merge(df.filter(like='grade_1'),
on='grade_1', how='left')
.merge(df.filter(like='grade_2'),
on='grade_2', how='left')
.sort_index(axis=1)
)

输出:

grade_1  grade_1_count      grade_2  grade_2_count
0       A           19.0         pass           39.0
1       B           28.0         fail           18.0
2       C           32.0  not present            NaN
3       D            NaN   borderline            NaN
4       E            NaN         None            NaN
5       F            NaN         None            NaN
多个合并:

df2 = pd.DataFrame(list(zip_longest(*grade_dict.values())), columns=grade_dict)
for col in grade_dict:
df2 = df2.merge(df.filter(like=col),
on=col, how='left')
df2

如果您只需要在grade_1上合并而不更新grade_2的非nan,则可以将grade_dict转换为df,然后使用combine_first:

print (df.set_index("grade_1").combine_first(pd.DataFrame(grade_dict.values(),
index=grade_dict.keys()).T.set_index("grade_1"))
.fillna({"grade_1_count": 0}).reset_index())
grade_1  grade_1_count      grade_2  grade_2_count
0       A           19.0         pass           39.0
1       B           28.0         fail           18.0
2       C           32.0  not present            NaN
3       D            0.0   borderline            NaN
4       E            0.0         None            NaN
5       F            0.0         None            NaN

相关内容

  • 没有找到相关文章

最新更新