具有来自两个不同来源(即Oracle和MySQL)的以下数据集:
DF1(Oracle):
A B C
1122 8827
822 8282 6622
727 72 1183
91 5092
992 113 7281
DF2(MySQL):
E F G
8827 6363
822 5526 9393
727 928 6671
9221 7282
992 921 7262
445 6298
需要将它们加入大熊猫,以便获得以下结果。
预期o / p:
A B C F G
822 8282 6622 5526 9393
727 72 1183 928 6671
992 113 7281 921 7262
1122 8827
91 5092
8827 6363
445 6298
Update_1:
根据建议,尝试以下操作:
import pandas as pd
data1 = [['',1122,8827],[822,8282,6622],[727,72,1183],['',91,5092],[992,113,7281]]
df1 = pd.DataFrame(data1,columns=['A','B','C'],dtype=float)
print df1
data2 = [['',8827,6363],[822,5526,9393],[727,928,6671],['',9221,7282],[992,921,7262],['',445,6298]]
df2 = pd.DataFrame(data2,columns=['E','F','G'],dtype=float)
print df2
DF11 = df1.set_index(df1['A'].fillna(df1.groupby('A').cumcount().astype(str)+'A'))
DF22 = df2.set_index(df2['E'].fillna(df2.groupby(['E']).cumcount().astype(str)+'E'))
DF11.merge(DF22, left_index=True, right_index=True, how='outer')\
.reset_index(drop=True)\
.drop('E', axis=1)
获得以下信息:
A B C F G
0 727 72.0 1183.0 928.0 6671.0
1 822 8282.0 6622.0 5526.0 9393.0
2 992 113.0 7281.0 921.0 7262.0
3 1122.0 8827.0 8827.0 6363.0
4 1122.0 8827.0 9221.0 7282.0
5 1122.0 8827.0 445.0 6298.0
6 91.0 5092.0 8827.0 6363.0
7 91.0 5092.0 9221.0 7282.0
8 91.0 5092.0 445.0 6298.0
问:如何避免重复值并获得期望的o / p?
答案 0 :(得分:2)
您的问题很复杂,因为联接键中为null。您可以尝试使用类似的逻辑来实现结果,或者为不包含null的联接创建另一个键。
DF11 = DF1.set_index(DF1['A'].fillna(DF1.groupby('A').cumcount().astype(str)+'A'))
DF22 = DF2.set_index(DF2['E'].fillna(DF2.groupby(['E']).cumcount().astype(str)+'E'))
DF11.merge(DF22, left_index=True, right_index=True, how='outer')\
.reset_index(drop=True)\
.drop('E', axis=1)
输出:
A B C F G
0 NaN 1122.0 8827.0 NaN NaN
1 822.0 8282.0 6622.0 5526.0 9393.0
2 727.0 72.0 1183.0 928.0 6671.0
3 NaN 91.0 5092.0 NaN NaN
4 992.0 113.0 7281.0 921.0 7262.0
5 NaN NaN NaN 8827.0 6363.0
6 NaN NaN NaN 9221.0 7282.0
7 NaN NaN NaN 445.0 6298.0
更新,由于您的数据为空白而不是np.nan,因此我不得不在那些语句中添加一个方法以将''替换为np.nan才能使fillna正常工作。
df1.set_index(df1['A'].replace('',np.nan).fillna(df1.groupby('A').cumcount().astype(str)+'A'))
尝试一下:
import pandas as pd
data1 = [['',1122,8827],[822,8282,6622],[727,72,1183],['',91,5092],[992,113,7281]]
df1 = pd.DataFrame(data1,columns=['A','B','C'],dtype=float)
print(df1)
data2 = [['',8827,6363],[822,5526,9393],[727,928,6671],['',9221,7282],[992,921,7262],['',445,6298]]
df2 = pd.DataFrame(data2,columns=['E','F','G'],dtype=float)
print(df2)
DF11 = df1.set_index(df1['A'].replace('',np.nan).fillna(df1.groupby('A').cumcount().astype(str)+'A'))
DF22 = df2.set_index(df2['E'].replace('',np.nan).fillna(df2.groupby(['E']).cumcount().astype(str)+'E'))
DF11.merge(DF22, left_index=True, right_index=True, how='outer')\
.reset_index(drop=True)\
.drop('E', axis=1)
答案 1 :(得分:0)
对于您想要的输出,您是否有意省略E列?
如果没有...
我不确定来自不同来源的数据框是否会影响它们如何结合在一起。
import pandas as pd
...
frames = [DF1, DF2]
result = pd.concat(frames)
这应该执行您想要完成的联接。