根据列中的匹配,附加两个数据帧并用其中一个DF的值填充NAN



我有两个数据帧,我想将它们附加/合并为一个(请参阅"wanted result"中的所需结果(。我可以这样做,但数据帧2中的行在列Name1和Name2中以NaN结尾(请参见数据帧"我的结果"。

我希望将结果中的NaN值替换为Dataframe 1中的值,该值基于Num Column 中的数字

数据帧1:

Num   Name1  Name2   URL
0  1       a      b     url1
1  2       c      d     url2
2  3       e      f     url3
3  4       g      h     url4

数据帧2:

Num     URL    
0  1      url5
1  2      url6
2  3      url7
3  4      url8

想要的结果:

Num   Name1  Name2   URL
0  1       a      b     url1
1  2       c      d     url2
2  3       e      f     url3
3  4       g      h     url4
4  1       a      b     url5
5  2       c      d     url6
6  3       e      f     url7
7  4       g      h     url8

我的结果:

Num   Name1  Name2   URL
0  1       a      b     url1
1  2       c      d     url2
2  3       e      f     url3
3  4       g      h     url4
4  1       NaN   NaN    url5
5  2       NaN   NaN    url6
6  3       NaN   NaN    url7
7  4       NaN   NaN    url8

您可以合并数据帧:

df2.merge(df1[df1.columns[:-1]], on=['Num']).reindex(df1.columns, axis=1)

给出:

Num Name1 Name2   URL
0    1     a     b  url5
1    2     c     d  url6
2    3     e     f  url7
3    4     g     h  url8

只需插入所有内容:

pd.concat((df1, df2.merge(df1[df1.columns[:-1]], on=['Num']).reindex(df1.columns, axis=1)),
ignore_index=True)

如预期:

Num Name1 Name2   URL
0    1     a     b  url1
1    2     c     d  url2
2    3     e     f  url3
3    4     g     h  url4
4    1     a     b  url5
5    2     c     d  url6
6    3     e     f  url7
7    4     g     h  url8

我们可以用ffill进行groupby

df = pd.concat([df1,df2])
df.fillna(df.groupby('Num').ffill(),inplace=True)
df
Out[43]: 
Num Name1 Name2   URL
0    1     a     b  url1
1    2     c     d  url2
2    3     e     f  url3
3    4     g     h  url4
0    1     a     b  url5
1    2     c     d  url6
2    3     e     f  url7
3    4     g     h  url8

这里有一种不同的方式:

df3 = df.assign(URL = df1['URL']+','+df2['URL'])
df3.assign(URL = df3['URL'].str.split(',')).explode('URL').sort_values('URL')

最新更新