2016-08-07 26 views
-2

Ich arbeite derzeit mit Pandas auf einem Dataframe und nach dem Lesen einer CSV-Datei und Konvertieren einer bestimmten Spalte in Str, Pandas scheint alle Duplikate dieser Zeile in NaNs zu transformieren.Python Pandas - read_csv macht Duplikate zu NaN

bla = pd.read_csv(bla_path, sep=',',converters={'order_id':str}) 

und es gibt mir diese Ergebnisse:

internal_conversion_id  order_id conversion_target_id \ 
0     85   9222     67 
1     20   9224     65 
2     20    NaN     65 
3     20    NaN     65 
4     33   9233     67 
5     33    NaN     67 

Weiß jemand, was ich fehle? Die ursprüngliche Datei enthält die Duplikate.

EDIT: Ich habe gerade überprüft - das passiert auch, wenn ich converters nicht verwende.

EDIT 2: hier einige Zeilen aus dem ursprünglichen csv:

internal_conversion_id,order_id,conversion_target_id,product_nr 
85,9222,67,1 
20,9224,65,1 
20,9224,65,2 
20,9224,65,3 
33,9223,67,1 
33,9223,67,2 

EDIT3:

ok, ich glaube, ich die Quelle gefunden.

Irgendwann im Code wollte ich eine zweite Variable mit dem gleichen Inhalt wie die erste, aber ohne die Duplikate erstellen. Pandas löscht auch alle Duplikate in der ersten Variablen. Wie kann ich Pandas davon abhalten?

hier ist das Stück Code:

bla2 = bla 

bla2['order_id'] = bla2['order_id'].drop_duplicates() 
bla2 = bla2[pd.notnull(bla2['order_id'])] 
+1

Können Sie ein paar Zeilen der Post Original-CSV-Datei? –

+1

Was meinst du mit Duplikaten? – ayhan

+0

Ohne einen Blick auf Ihre CSV-Datei, es ist schwer zu helfen.Veröffentlichen Sie den Kopf Ihrer CSV-Datei wie @ AlbertoGarcia-Raboso sagte –

Antwort

1

, wenn Sie die Duplikate gerade fallenlassen wollte man es auf diese Weise getan haben könnte:

bla2 = bla2.drop_duplicates(subset='order_id') 

, was Sie taten, war die Säule zu überschreiben mit den zurückgegebenen Ergebnissen von drop_duplicates für diese Spalte durch dies zu tun:

bla2['order_id'] = bla2['order_id'].drop_duplicates() 

an, dass zeigen Sie NaN eingeführt, wo die Werte Duplikate waren:

In [3]: 
df['order_id'].drop_duplicates() 

Out[3]: 
0 9222 
1 9224 
4 9223 
Name: order_id, dtype: int64 

In [4]: 
df['order_id'] = df['order_id'].drop_duplicates() 
df 

Out[4]: 
    internal_conversion_id order_id conversion_target_id product_nr 
0      85  9222     67   1 
1      20  9224     65   1 
2      20  NaN     65   2 
3      20  NaN     65   3 
4      33  9223     67   1 
5      33  NaN     67   2 

jedoch die letzte Zeile des Codes haben sollte gearbeitet:

In [5]: 
df = df[pd.notnull(df['order_id'])] 
df 

Out[5]: 
    internal_conversion_id order_id conversion_target_id product_nr 
0      85  9222     67   1 
1      20  9224     65   1 
4      33  9223     67   1 

Also ich weiß nicht, ob Sie verwirrt

EDIT

wenn Sie dann eine Kopie machen, wollen einfach nur eine Kopie:

bla2 = bla.copy() 

dann können Sie tun, was Sie mit bla2 wollen und es wird bla

oder Sie erstellen nicht bla2 aus dem Ergebnis der bla.drop_duplicates beeinflussen:

bla2 = bla.drop_duplicates(subset='order_id') 
+1

Ja, weil 'drop_duplicates()' eine tiefe Kopie des Frames erstellt. Der kaputte Code im OP hatte nichts mit dem CSV-Laden zu tun und war einfach deshalb, weil OP die Referenzsemantik von Python missverstanden hat. –

+2

@JohnZwinck Ich weiß, ich wünschte, die Leute würden versuchen, den Code, den sie mit ihren Daten posten und alles relevante zu machen, es ist unglaublich für mich, wie dies nicht bei Menschen registrieren, wenn sie versuchen zu erklären, was schief geht – EdChum

+0

Hallo, danke für die Eingabe. Leider kann ich den ganzen Code nicht posten. Das Entfernen der zweiten Zeile ändert jedoch nicht die Ausgabe der ersten Variablen. Ich denke, 'bla2 = bla' ist nicht der richtige Weg, eine zweite Variable mit dem gleichen Inhalt in Pandas zu erstellen, oder? – cesco