Ich habe einen Datensatz, der so aussieht (höchstens 5 Spalten - kann aber kleiner sein)
1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4
....
Ich versuche, pandas read_table zu verwenden, um dies in einen 5-Spalten-Datenrahmen einzulesen. Ich möchte dies ohne zusätzliche Massage einlesen.
Wenn ich es versuche
import pandas as pd
my_cols=['A','B','C','D','E']
my_df=pd.read_table(path,sep=',',header=None,names=my_cols)
Ich erhalte die Fehlermeldung "Spaltennamen haben 5 Felder, Daten haben 3 Felder".
Gibt es eine Möglichkeit, Pandas dazu zu bringen, beim Lesen der Daten NaN für die fehlenden Spalten auszufüllen?
names=my_cols
womy_cols
mindestens so lang war wie die Linie mit den meisten Feldern. Wenn die maximale Anzahl von Feldern nicht im Voraus bekannt ist, können Sie dynamisch extrahieren, indem Sie die Datei vorher überwith open('my.csv') as f: num_cols = max(len(line.split(',')) for line in f); f.seek(0); df = pd.read_csv(f, names=range(num_cols))
lesen. Der Nachteil ist jedoch, dass die Datei zweimal gelesen wird.pd.read_csv(file, names=my_cols)
funktioniert auch dann, wennlen(my_cols)
die Anzahl der Felder in einer oder mehreren Zeilen geringer ist. Die zusätzlichen Felder werden einfach verworfen.Es würde mich auch interessieren, ob dies möglich ist. Aus dem Dokument geht hervor, dass dies nicht der Fall ist. Was Sie wahrscheinlich tun könnten, ist, die Datei Zeile für Zeile zu lesen und jeden Lesevorgang zu einem DataFrame zu verketten:
import pandas as pd df = pd.DataFrame() with open(filepath, 'r') as f: for line in f: df = pd.concat( [df, pd.DataFrame([tuple(line.strip().split(','))])], ignore_index=True )
Es funktioniert aber nicht auf die eleganteste Art, denke ich ...
quelle
OK. Ich bin mir nicht sicher, wie effizient das ist - aber hier ist, was ich getan habe. Würde gerne hören, ob es einen besseren Weg gibt, dies zu tun. Vielen Dank !
from pandas import DataFrame list_of_dicts=[] labels=['A','B','C','D','E'] for line in file: line=line.rstrip('\n') list_of_dicts.append(dict(zip(labels,line.split(',')))) frame=DataFrame(list_of_dicts)
quelle