1

我有以下数据框:

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代表作者的ResearcherIDORCID。一位作者可能有多个电子邮件地址,因此列有重复。oiemail

首先,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

4

1 回答 1

2

尝试 2 transform。每列一个。开ri,使用first。在email, 使用dropna,unique和的组合join

g = df.dropna(subset=['oi']).groupby('oi')
df['ri']    = g.ri.transform('first')
df['email'] = g.email.transform(lambda x: ';'.join(x.dropna().unique()))

Out[79]:
  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
于 2020-08-29T04:17:30.090 回答