我有两个pandas数据帧,df1和df2。两者都有至少两个具有相同名称的列(c1和c2),然后还有其他列,例如:
view
我想合并两个数据框,以便:
在上一个问题中,我得到了执行外连接的答案,我根据c1和c2执行了外连接,并返回以下内容,例如:
df1
-----------------
c1 c2 c4 c5
-----------------
10 1 hh 2231
11 1 fgf 2142
12 1 fg 1232
df2
-----------------
c1 c2 c6 c7
-----------------
10 2 110 231
10 3 111 332
11 2 112 123
11 3 113 432
12 2 114 432
12 3 115 432
13 2 116 432
13 3 117 432
14 2 118 432
14 3 119 432
但是,我想重复c4和c5的值作为结果df如下:
结果数据框:
c1 c2 c4 c5 c6 c7
--------------------------------
10 1 hh 2231
10 2 110 231
10 3 111 332
任何人都可以帮我解决这个问题吗?提前谢谢!
答案 0 :(得分:0)
您只需使用pd.concat
而不是合并或加入。这是一个例子
import pandas as pd
import numpy as np
a = np.arange(1,4)
b = np.arange(5,8)
c = np.random.randint(0,10,size=3)
d = np.random.randint(0,10,size=3)
df_1 = pd.DataFrame({'a':a,'b':b,'c':c,'d':d})
out:
a b c d
0 1 5 5 1
1 2 6 7 5
2 3 7 6 9
a = np.arange(4,7)
b = np.arange(7,10)
e = np.random.randint(0,10,size=3)
f = np.random.randint(0,10,size=3)
df_2 = pd.DataFrame({'a':a,'b':b,'e':c,'f':d})
df_2
out:
a b e f
0 4 7 9 9
1 5 8 9 3
2 6 9 2 1
pd.concat([df_1,df_2])
out:
a b c d e f
0 1 5 5.0 1.0 NaN NaN
1 2 6 7.0 5.0 NaN NaN
2 3 7 6.0 9.0 NaN NaN
0 4 7 NaN NaN 9.0 9.0
1 5 8 NaN NaN 9.0 3.0
2 6 9 NaN NaN 2.0 1.0
答案 1 :(得分:0)
您可以使用:
df = (pd.concat([df1[['c1','c2']], df2[['c1','c2']]])
.sort_values(['c1','c2'])
.drop_duplicates()
.merge(df1, on=['c1','c2'], how='left')
.merge(df2, on=['c1','c2'], how='left')
)
df[['c4','c5']] = df.groupby('c1')['c4','c5'].apply(lambda x: x.ffill().bfill())
print (df)
c1 c2 c4 c5 c6 c7
0 10 1 hh 2231.0 NaN NaN
1 10 2 hh 2231.0 110.0 231.0
2 10 3 hh 2231.0 111.0 332.0
3 11 1 fgf 2142.0 NaN NaN
4 11 2 fgf 2142.0 112.0 123.0
5 11 3 fgf 2142.0 113.0 432.0
6 12 1 fg 1232.0 NaN NaN
7 12 2 fg 1232.0 114.0 432.0
8 12 3 fg 1232.0 115.0 432.0
9 13 2 NaN NaN 116.0 432.0
10 13 3 NaN NaN 117.0 432.0
11 14 2 NaN NaN 118.0 432.0
12 14 3 NaN NaN 119.0 432.0