2017-12-15 1 views
4

ich gelesen bin in einer großen csv in Pandas zu finden, mit:Wie die Eingabezeile mit gemischten Typen

features = pd.read_csv(filename, header=None, names=['Time','Duration','SrcDevice','DstDevice','Protocol','SrcPort','DstPort','SrcPackets','DstPackets','SrcBytes','DstBytes'], usecols=['Duration','SrcDevice', 'DstDevice', 'Protocol', 'DstPort','SrcPackets','DstPackets','SrcBytes','DstBytes']) 

ich:

sys:1: DtypeWarning: Columns (6) have mixed types. Specify dtype option on import or set low_memory=False. 
    %!PS-Adobe-3.0 

Wie kann ich die erste Zeile in der Eingabe finden was verursacht diese Warnung? Ich muss dies tun, um das Problem mit der Eingabedatei zu debuggen, die keine gemischten Typen haben sollte.

+0

bitte hier ähnliche Frage sehen - https://stackoverflow.com/questions/24251219/pandas-read-csv-low-memory-and-dtype-options – mm441

+1

@ mm441 Danke, aber das scheint nicht ein enthalten Antwort, wie man die Linie findet, die die Warnung verursacht, tut es? – eleanora

+0

Wie groß ist Ihre Datei? Wenn es klein genug ist, kann "mit dem Auge" der schnellste Weg sein. –

Antwort

1
for endrow in range(1000, 4000000, 1000): 
    startrow = endrow - 1000 
    rows = 1000 
    try: 
     pd.read_csv(filename, dtype={"DstPort": int}, skiprows=startrow, nrows=rows, header=None, 
       names=['Time','Duration','SrcDevice','DstDevice','Protocol','SrcPort', 
         'DstPort','SrcPackets','DstPackets','SrcBytes','DstBytes'], 
       usecols=['Duration','SrcDevice', 'DstDevice', 'Protocol', 'DstPort', 
         'SrcPackets','DstPackets','SrcBytes','DstBytes']) 
    except ValueError: 
     print(f"Error is from row {startrow} to row {endrows}") 

Split die Datei in mehrere Datenrahmen mit 1000 Zeilen jeweils in dem Bereich von Zeilen zu sehen, dass es gemischter Wert ist, dass dieses Problem verursacht.

1

Sobald Pandas die Datei gelesen hat, können Sie NICHT herausfinden, welche Zeilen problematisch waren (siehe this answer, warum zu wissen).

Das bedeutet, Sie sollten einen Weg finden, während Sie die Datei lesen. Lesen Sie z. B. die Datei zeilenweise und überprüfen Sie die Typen jeder Zeile. Wenn eine von ihnen nicht dem erwarteten Typ entspricht, haben Sie die gewünschte Zeile erhalten.

Um dies mit Pandas zu erreichen, können Sie chunksize=1 an pd.read_csv() übergeben, um die Datei in Blöcken (Datenrahmen mit der Größe N, 1 in diesem Fall) zu lesen. Sehen Sie die documentation, wenn Sie mehr darüber wissen möchten.

Der Code geht in etwa so:

# read the file in chunks of size 1. This returns a reader rather than a DataFrame 
reader = pd.read_csv(filename,chunksize=1) 

# get the first chunk (DataFrame), to calculate the "true" expected types 
first_row_df = reader.get_chunk() 
expected_types = [type(val) for val in first_row_df.iloc[0]] # a list of the expected types. 

i = 1 # the current index. Start from 1 because we've already read the first row. 
for row_df in reader: 
    row_types = [type(val) for val in row_df.iloc[0]] 
    if row_types != expected_types: 
     print(i) # this row is the wanted one 
     break 
    i += 1 

Beachten Sie, dass dieser Code eine Annahme macht, dass die erste Zeile „true“ Typen hat. Dieser Code ist wirklich langsam, also empfehle ich, dass Sie nur die Spalten überprüfen, die Sie für problematisch halten (obwohl dies nicht viel Performancegewinn bringt).

Verwandte Themen