2016-09-20 3 views
1

두 개의 CSV 파일을 병합하려고하는데 복제본을 제거하고 싶지 않습니다. 첫 번째 열 "PDB ID"를 확인한 다음 두 번째 열 "체인 ID"를 확인하기 만하면됩니다. 모든 값에는 입력 파일이 있습니다. 나는 병합 및 열 파일 하나를 추가하고 내가 스크립트 이상하지만, 그 결과 하나 개의 행을 세 시간에 같은 값을 받고 사용 2.두 개의 CSV 파일을 파이썬에서 병합합니다.

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
merged = a.merge(b, on='PDB ID') 
merged.to_csv("output.csv", index=False) 

파일 싶다.

File 1: Input 
PDB ID Chain ID Ligand ID Uniprot Acc 
3RSQ A NAI Q9X024 
3RTD A NAI Q9X024 
1E3E A NAI Q9QYY9 
1E3E B NAI Q9QYY9 
1E3I A NAI Q9QYY9 
1E3I B NAI Q9QYY9 

File 2: Input 
PDB ID Chain ID Avg 
1E3E A 31.566 
1E3E B 17.867 
3RSQ A 57.653 
1E3I A 27.63 
1E3I B 17.867 
3RTD A 48.806 

Getting Output: 
PDB ID Chain ID_x Avg Ligand ID Uniprot Acc 
3RSQ A 57.653 NAI Q9X024 
3RTD A 48.806 NAI Q9X024 
1E3E A 31.566 NAI Q9QYY9 
1E3E A 31.566 NAI Q9QYY9 
1E3E B 17.867 NAI Q9QYY9 
1E3E B 17.867 NAI Q9QYY9 
1E3I A 27.63 NAI Q9QYY9 
1E3I A 27.63 NAI Q9QYY9 
1E3I B 17.867 NAI Q9QYY9 
1E3I B 17.867 NAI Q9QYY9 


Expected Output: 

3RSQ A 57.653 NAI Q9X024 
3RTD A 48.806 NAI Q9X024 
1E3E A 31.566 NAI Q9QYY9 
1E3E B 17.867 NAI Q9QYY9 
1E3I A 27.63 NAI Q9QYY9 
1E3I B 17.867 NAI Q9QYY9 

답변

0

어쩌면 당신은 행을 복제하지 pandas merge 방법의 left_indexright_index 매개 변수를 사용할 수 있습니다.

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
cols = b.columns.difference(a.columns) 
merged = a.merge(b[cols], left_index=True, right_index=True) 
merged.to_csv("output.csv", index=False) 

이 초래한다 :

Chain ID Ligand ID PDB ID Uniprot Acc  Avg 
0  A  NAI 3RSQ  Q9X024 57.653 
1  A  NAI 3RTD  Q9X024 48.806 
2  A  NAI 1E3E  Q9QYY9 31.566 
3  B  NAI 1E3E  Q9QYY9 17.867 
4  A  NAI 1E3I  Q9QYY9 21.63 
5  B  NAI 1E3I  Q9QYY9 17.867 

EDIT : 위해

이 때 달성하도록 부가 적으로, 컬럼 이름을 복제하지 this solution를 사용하여, I는 다음과 같은 제안 각 DataFrame의 인덱스가 동일한 PDB ID에 해당하지 않는 경우 DataFrame a을 정렬하여 해당 인덱스를 검색하고 indi 이 값에 DataFrame b의 정렬 된 버전의 ces. 마지막으로 DataFrame b을 인덱스로 정렬하고 PDB ID은 DataFrame a과 같은 방식으로 정렬해야합니다.

import pandas as pd 


a = pd.read_csv("testfile.csv") 
b = pd.read_csv("testfile_1.csv") 
b = b.dropna(axis=1) 
b = b.sort_values(by='PDB ID') 
b.index = a.sort_values(by='PDB ID').index 
b = b.sort_index() 
cols = b.columns.difference(a.columns) 
merged = a.merge(b[cols], left_index=True, right_index=True) 
merged.to_csv("output.csv", index=False) 

이 병합 된 결과 :

Chain ID Ligand ID PDB ID Uniprot Acc  Avg 
0  A  NAI 3RSQ  Q9X024 57.653 
1  A  NAI 3RTD  Q9X024 48.806 
2  A  NAI 1E3E  Q9QYY9 31.566 
3  B  NAI 1E3E  Q9QYY9 17.867 
4  A  NAI 1E3I  Q9QYY9 27.63 
5  B  NAI 1E3I  Q9QYY9 17.867 

EDIT 2 this answer에서 발견

여기

은 훨씬 단순한 솔루션이다.

Chain ID Ligand ID PDB ID Uniprot Acc  Avg 
0  A  NAI 3RSQ  Q9X024 57.653 
1  A  NAI 3RTD  Q9X024 48.806 
2  A  NAI 1E3E  Q9QYY9 31.566 
3  B  NAI 1E3E  Q9QYY9 17.867 
4  A  NAI 1E3I  Q9QYY9 27.63 
5  B  NAI 1E3I  Q9QYY9 17.867 
6  a   a  a   a  NaN 
+0

감사합니다, 실제로 파일 1 열 :

import pandas as pd a = pd.read_csv("testfile.csv") b = pd.read_csv("testfile_1.csv") b = b.dropna(axis=1) merged = a.merge(b, on=['PDB ID', 'Chain ID'], how='outer') merged.to_csv("output.csv", index=False) 

행의 수는 동일하지 않아도 그 결과는 당신이 무엇을 기대해야한다 (내 마지막 행은 행의 다른 수의 예입니다) "PDB ID"와 File2 열 "PBD ID"는 동일한 순서가 아닙니다. 위의 입력 파일을 편집했습니다. 나는 위의 코드를 시도했지만 두 파일 열 "PDB ID"가 같은 순서가 아니기 때문에 출력과 동일한 입력 파일을 얻습니다. – krish

+0

정렬되지 않은 "PDB ID"시퀀스에서 작동해야하는 내 대답을 편집했습니다. 두 DataFrames의 행 수가 같다고 가정합니다. – PyNoob

+0

감사합니다. 오류 : 길이 불일치 : 예상 축에 3049 개의 요소가 있고 새로운 값에 3060 개의 요소가 있습니다. – krish

관련 문제