2017-03-01 140 views
-1

的獨特combbination我有兩個DataFrames具有不同尺寸和不同數量的列,例如:比較兩個dataframes並找到列

DF1: 
index col1 col2 col3 
1  AA A12 SH7B 
2  Ac DJS 283 
3  ZH 28S 48d 

DF2: 
index col1 col2 col3 col4 
2  AA cc2 SH7B hd5 
7  Ac DJS 283,dhb re 
10  ZH 28S SJE,48d 385d 
23 3V4 38D 350,eh4 sm4 
44  S3 3YE 032,she 3927 

所以索引是不同的。並且在第一個數據框中有一些與其他數據框相似的數據的獨特組合,我想查找它們。因此,我想循環遍歷第二個數據框的行並查找每行的每個數據組合(例如:( 7,Ac,DJS,283,re)和(7,Ac,DJS,dhb,re)是索引7的兩種組合,因爲列中有多個值),並將其與第一個數據框的行進行比較並打印如果在第二個數據幀中有相同的組合,它也會出來。

result: 
1  Ac DJS 283 
2  ZH 28S 48d 

謝謝

+0

定義除非有相似性的正式定義,否則您的問題無法通過算法解決。 – DyZ

+0

我在例子中解釋過,類似的我的意思是相同的...例如(Ac,DJS,283)的組合可以在兩個數據幀中找到,所以這是結果數據幀的行之一 – faranak777

+0

但是沒有'283 '在第二張桌子。有'283,dhb'代替。 – DyZ

回答

0

您需要從數據幀2中,首先拆分COL3,然後用數據幀1把它合併;分割數據幀2的COL3,一個常用的方法是分開並展平,而COL3使用numpy.repeat使其它列的相等長度:「相似的」

import pandas as pd 
import numpy as np 
from itertools import chain 

# count how many repeats are needed for other columns based on commas 
repeats = df2.col3.str.count(",") + 1   

# repeat columns except for col3, split and flatten col3 and merge it back with df1 
(df2.drop('col3', 1).apply(lambda col: np.repeat(col, repeats)) 
.assign(col3 = list(chain.from_iterable(df2['col3'].str.split(',')))) 
.merge(df1)) 

# col1 col2 col4 col3 
#0 Ac DJS  re  283 
#1 ZH 28S 385d  48d 
+0

謝謝你,我得到這個錯誤:不能從dtype('float64')根據規則'安全'投射數組數據dtype('int64')「 – faranak777

+0

不完全確定發生了什麼,你可以嘗試將數據幀轉換爲str類型:'df1 = df1.astype(str); df2 = df2.astype(str)'。 – Psidom