Die Methode pandas read_csv () interpretiert 'NA' als nan (keine Zahl) anstelle einer gültigen Zeichenfolge.
Im folgenden einfachen Fall ist zu beachten, dass die Ausgabe in Zeile 1, Spalte 2 (auf Null basierende Zählung) 'nan' anstelle von 'NA' ist.
sample.tsv ( tabulatorgetrennt )
PDB-KETTE SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_END SP_BEG SP_END
5d8b N P60490 1 146 1 146 1 146
5d8b NA P80377 1 126 1 126 1 126
5d8b O P60491 1 118 1 118 1 118
read_sample.py
import pandas as pd
df = pd.read_csv(
'sample.tsv',
sep='\t',
encoding='utf-8',
)
for df_tuples in df.itertuples(index=True):
print(df_tuples)
Ausgabe
(0, u'5d8b ', u'N', u'P60490 ', 1, 146, 1, 146, 1, 146)
(1, u'5d8b', nan, u'P80377 ', 1, 126, 1 126, 1, 126)
(2, u'5d8b ', u'O', u'P60491 ', 1, 118, 1, 118, 1, 118)
zusätzliche Information
Das erneute Schreiben der Datei mit Anführungszeichen für Daten in der Spalte 'CHAIN' und die anschließende Verwendung des Parameters quotechar quotechar='\''
führt zum gleichen Ergebnis. Das Übergeben eines Wörterbuchs mit Typen über den Parameter dtype dtype=dict(valid_cols)
ändert nichts am Ergebnis.
Eine alte Antwort auf Verhindern, dass Pandas automatisch auf den Typ in read_csv schließen, schlägt vor, zuerst ein numpy-Datensatzarray zum Parsen der Datei zu verwenden. Angesichts der Möglichkeit, jetzt Spalten-dtypes anzugeben, sollte dies jedoch nicht erforderlich sein.
Beachten Sie, dass itertuples () verwendet wird, um dtypes beizubehalten, wie in der iterrows-Dokumentation beschrieben: "Um dtypes beim Durchlaufen der Zeilen beizubehalten, ist es besser, itertuples () zu verwenden, das Tupel der Werte zurückgibt und im Allgemeinen schneller als iterrows ist."
Das Beispiel wurde auf Python 2 und 3 mit den Pandas-Versionen 0.16.2, 0.17.0 und 0.17.1 getestet.
Gibt es eine Möglichkeit, einen gültigen String 'NA' zu erfassen, anstatt ihn in nan umzuwandeln?