在python中加入两个带条件的df

时间:2018-04-29 09:07:45

标签: python pandas join merge

我有两个df。 PHPhotoLibrary.shared().performChanges({ // Add the compressed (HEIF) data as the main resource for the Photos asset. let creationRequest = PHAssetCreationRequest.forAsset() creationRequest.addResource(with: .photo, data: compressedData, options: nil) // Add the RAW (DNG) file as an altenate resource. let options = PHAssetResourceCreationOptions() options.shouldMoveFile = true creationRequest.addResource(with: .alternatePhoto, fileURL: rawURL, options: options) }, completionHandler: self.handlePhotoLibraryError) 有超过2百万行并且有完整的数据。我想加入来自df1的数据,这些数据有超过70,000行,但它的结构有点复杂。 df1用于eac行键df2KO-STA。 df2在某些情况下仅在KO-PAR上有数据,在某些情况下仅在KO-STA上,在某些情况下仅在KO-PAR上。 我想合并这两个df并获取Need1Need2上的数据。

DF1

          STA_SID   DST_SID        CC   KO_SIFKO    KO-STA       KO-PAR
135  10021582  28878502            NaN       634    634-83        537-780/9   
117  10028732  29999540            NaN       657  657-1729        537-780/4
117  10028732  29999541            NaN       657  657-1729        537-780/4
117  10028732  29999542            NaN       657  657-1729        537-780/4
117  10028732  29999543            NaN       657  657-1729        537-780/4
117  10028732  31356572            NaN       657  657-1729        537-780/4

df2

        KO-STA  STA-PAR       KO-PAR          Need1       Need2  \
0   1976-_    366/2   1976-366/2                Bio       49.500000   
1    991-_  329/128  991-329/128                 PH      184.399994   
2  2147---    96/19   2147-96/19                Win        8.850000   
3   2048-_    625/4   2048-625/4                SSE        4.940000   
4   2194-_    285/3   2194-285/3               TI f      163.000000   
5  2386---     97/1    2386-97/1                Bio       49.500000   
6   2002-_   2002/9  2002-2002/9                Win       12.850000   
7   1324-_       62      1324-62                Win        8.850000   
8   1625-_    980/1   1625-980/1                Win        8.850000   
9   1625-_    980/1   1625-980/1                Bio       49.500000 

我的尝试是使用以下代码

GURS_ES1 = pd.merge(df1.reset_index(), df2.reset_index(), on = 'KO-STA')
GURS_ES2 = pd.merge(GURS_ES1.reset_index(), df2.reset_index(), on = 'KO-PAR')

但是在第一次合并之后,GURS_ES1有两个索引KO-PAR_xKO-PAR_y,并且它们不会将它们作为一列连接起来。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我举例说明了如何处理您观察到的行为的原因:

首先,让我们构建我们的样本数据

df1 = pd.DataFrame(np.random.randint(1,3,size=(3,3)),columns=['a1','x1','x2'])

输出

   a1   x1  x2
0   1   2   1
1   2   1   1
2   1   2   2

现在,其他数据框

df2 = pd.DataFrame(np.random.randint(1,3,size=(3,3)),columns=['a2','x1','x2'])

    a2  x1  x2
0   2   2   1
1   1   2   2
2   1   1   2

现在,如果我们仅合并(!)两个数据帧中出现的索引之一,那么pandas希望您能够重建索引最初来自哪个数据帧

pd.merge(df1,df2, on='x1')

输出

   a1  x1 x2_x a2 x2_y
0   1   2   1   2   1
1   1   2   1   1   2
2   1   2   2   2   1
3   1   2   2   1   2
4   2   1   1   1   2

现在,摆脱这种情况的最简单方法是在其中一个数据帧中删除一个双重出现的列:

pd.merge(df1[df1.columns.drop('x2')], df2, on='x1')

输出

    a1  x1  a2  x2
0   1   2   2   1
1   1   2   1   2
2   1   2   2   1
3   1   2   1   2
4   2   1   1   2

但您也可以合并列列表。请注意,我们在这里执行内连接,这可以显着减少输出数据帧中的行数(如果两列上没有匹配项,甚至会导致空数据帧)

pd.merge(df1,df2, on=['x1','x2'])

    a1  x1  x2  a2
0   1   2   1   2
1   1   2   2   1