2017-03-01 5 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 

당신은 가 먼저 데이터 프레임 2에서COL3을 분할해야하고 데이터 프레임 1로 다시 병합

+0

정의를 유사성에 대한 공식적인 정의가 없다면 문제는 알고리즘 적으로 해결 될 수 없습니다. – DyZ

+0

나는 예제에서 설명했다. 비슷한 의미로 ... (Ac, DJS, 283)의 조합은 두 데이터 프레임 모두에서 찾을 수 있으므로 결과 데이터 프레임의 행 중 하나이다. – faranak777

+0

그러나 '283 '두 번째 테이블에. 대신'283, dhb'가 있습니다. – DyZ

답변

0

감사합니다; 데이터 프레임 (2)의 COL3 분할하는 일반적인 방법은 다른 컬럼의 길이가 동일하게 numpy.repeat를 사용하면서 분할하고 COL3 평탄화하는 것이다. "유사"

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

관련 문제