我有以下数据框:
Out[117]: mydata
author email ri oi
0 X1 NaN NaN 0000-0001-8437-498X
1 X2 NaN NaN NaN
2 X3 ab@ma.com K-5448-2012 0000-0001-8437-498X
3 X4 ab2@ma.com NaN 0000-0001-8437-498X
4 X5 ab@ma.com NaN 0000-0001-8437-498X
其中 columnri
代表作者的ResearcherID和ORCID。一位作者可能有多个电子邮件地址,因此列有重复。oi
email
首先,ri
如果 na 中的相应行共享相同的值,我将尝试oi
使用 中的非 NaN 值填充 na ri
。我想要的结果是:
author email ri oi
0 X1 NaN K-5448-2012 0000-0001-8437-498X
1 X2 NaN NaN NaN
2 X3 ab@ma.com K-5448-2012 0000-0001-8437-498X
3 X4 ab2@ma.com K-5448-2012 0000-0001-8437-498X
4 X5 ab@ma.com K-5448-2012 0000-0001-8437-498X
其次,email
如果ri
(或oi
)中的值相同,则合并电子邮件并使用合并后的值将 na 填充到 column中。我想得到一个像下面这样的数据框:
author email ri oi
0 X1 ab@ma.com;ab2@ma.com K-5448-2012 0000-0001-8437-498X
1 X2 NaN NaN NaN
2 X3 ab@ma.com;ab2@ma.com K-5448-2012 0000-0001-8437-498X
3 X4 ab@ma.com;ab2@ma.com K-5448-2012 0000-0001-8437-498X
4 X5 ab@ma.com;ab2@ma.com K-5448-2012 0000-0001-8437-498X
我试过以下代码:
final_df = pd.DataFrame()
na_df = mydata[mydata.oi.isna()]
for i in set(mydata.oi.dropna()):
fill_df = mydata[mydata.oi == i]
fill_df.ri = fill_df.ri.fillna(method='ffill')
fill_df.ri = fill_df.ri.fillna(method='bfill')
null_df = pd.concat([null_df, fill_df])
final_df = pd.concat([final_df, na_df])
这段代码在第一步返回了我想要的代码,但是有没有一种优雅的方法来解决这个问题?此外,如何获取合并后的值,email
然后将合并后的值用作过程中的输入filling na
?