我有两个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行键df2
和KO-STA
。
df2在某些情况下仅在KO-PAR
上有数据,在某些情况下仅在KO-STA
上,在某些情况下仅在KO-PAR
上。
我想合并这两个df并获取Need1
和Need2
上的数据。
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_x
和KO-PAR_y
,并且它们不会将它们作为一列连接起来。有什么建议吗?
答案 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