2016-09-20 3 views
1

Ich versuche, zwei CSV-Datei zusammenführen, möchte ich nicht doppelt entfernen Ich möchte einfach die erste Spalte "PDB ID" überprüfen und dann zweite Spalte "Chain ID" überprüfen. Alle Werte haben Eingabedateien. Ich möchte fusionieren und Spaltendatei 1 hinzufügen und 2.Zusammenführen von zwei CSV-Datei in Python

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) 

ich oben Skript-Datei verwendet, sondern Ergebnis einer Zeile drei Mal denselben Wert zu bekommen.

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 

Antwort

0

Vielleicht können Sie die left_index und right_index Parameter pandas merge Methode verwenden, um keine Zeilen zu duplizieren. Zusätzlich this solution mit nicht Spaltennamen duplizieren, schlage ich folgendes:

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) 

, die in dieser Folge:

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:

Um dies zu erreichen, wenn die Indizes von jedem DataFrame entsprechen nicht PDB ID, ich endete mit dem Sortieren von DataFrame a, um seine Indizes abzurufen und die Indi zu setzen ces der sortierten Version von DataFrame b auf diese Werte. Schließlich sortiere ich DataFrame b durch seine Indizes und PDB ID sollte auf die gleiche Weise wie DataFrame a bestellt werden.

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) 

wo merged in dieser Folge:

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:

Hier ist eine viel einfachere Lösung ist, wie in this answer gefunden.

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) 

Die Anzahl der Zeilen sollte das Ergebnis gleich und nicht sein müssen, was Sie erwarten (meine letzte Zeile ist ein Beispiel für unterschiedliche Anzahl von Zeilen):

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

Danke, eigentlich file1 Spalte Eine "PDB ID" und File2 Spalte "PBD ID" ist nicht die gleiche Sequenz. Ich habe die obige Eingabedatei bearbeitet. Ich habe oben Code versucht, aber die gleiche Eingabedatei als Ausgabe bekommen, da beide Datei Spalte A "PDB ID" nicht die gleiche Sequenz ist. – krish

+0

Ich habe meine Antwort dort bearbeitet, wo sie für diese unsortierten "PDB ID" -Sequenzen funktionieren sollte. Es nimmt an, dass beide Datenrahmen dieselbe Anzahl von Zeilen haben. – PyNoob

+0

Danke, aber bekommen Fehler: Länge nicht übereinstimmen: Erwartete Achse hat 3049 Elemente, neue Werte haben 3060 Elemente – krish

Verwandte Themen