我有两个数据帧,我想将它们附加/合并为一个(请参阅"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')