熊猫:连接来自不同来源的数据框

时间:2018-11-01 20:25:47

标签: sql pandas dataframe

具有来自两个不同来源(即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?

2 个答案:

答案 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)

这应该执行您想要完成的联接。