2017-05-18 5 views
2

Ich habe einen Pandas Datenrahmen, der zwei Spalten enthält, mit Ablaufverfolgungsnummern [Col_1] und ID-Nummern [Col_2]. Ablaufverfolgungsnummern können Duplikate sein, ebenso wie ID-Nummern. Jede ID der Ablaufverfolgung & sollte jedoch nur einem bestimmten Kollegen in der angrenzenden Spalte entsprechen. Python Pandas different value_counts() in zwei Spalten der gleichen len()

Jedes meiner beiden Spalten sind gleich lang, haben aber unterschiedliche eindeutigen Wert zählt, die gleich sein sollte, wie unten dargestellt:

in[1]: Trace | ID 
     1  | 5054 
     2  | 8291 
     3  | 9323 
     4  | 9323 
     ... | 
     100 | 8928 

in[2]: print('unique traces: ', df['Trace'].value_counts()) 
     print('unique IDs: ', df['ID'].value_counts()) 

out[3]: unique traces: 100 
     unique IDs: 99 

In dem obigen Code, die gleiche ID-Nummer (9232) wird durch zwei Trace-Nummern dargestellt (3 & 4) - Wie kann ich diese Vorfälle isolieren? Danke fürs schauen!

+0

Bin ich richtig, dass Sie die Duplikate finden wollen? Wenn ja, möchten Sie die Zeilennummer oder die doppelte ID? – MSeifert

+0

@ MSeifert - Zeilennummer wäre bevorzugt. Vielen Dank! –

Antwort

2

Durch die Verwendung der duplicated() Funktion (docs) können Sie wie folgt vorgehen:

df[df['ID'].duplicated(keep=False)] 

Durch Setzen von keep auf False erhalten wir alle Duplikate (anstatt die erste oder die letzte auszuschließen).

Welche zurück:

Trace ID 
2 3 9323 
3 4 9323 
+0

Ich mag Kristof Lösung besser .... groupby sind teuer für große Datensätze. –

+0

@ScottBoston Aber dies prüft nur auf Duplikate. Das OP fragt nach der Anzahl eindeutiger Trace-Elemente für jede ID-Gruppe. Dies würde die gleichen IDs mit den gleichen Trace's zurückgeben, aber deins nicht. Ich denke nicht, dass das richtig ist. – ayhan

1

können Sie verwenden groupby und filter:

df.groupby('ID').filter(lambda x: x.Trace.nunique() > 1) 

Ausgang:

Trace  ID 
2  3 9323.0 
3  4 9323.0 
0
#this should tell you the index of Non-unique Trace or IDs. 

df.groupby('ID').filter(lambda x: len(x)>1) 
Out[85]: 
    Trace ID 
2  3 9323 
3  4 9323 

df.groupby('Trace').filter(lambda x: len(x)>1) 
Out[86]: 
Empty DataFrame 
Columns: [Trace, ID] 
Index: [] 
+0

Dies gibt nur ein df zurück, wenn es mehr als zwei Instanzen einer Ablaufverfolgungsnummer gibt - nicht wo, sagen wir, es gibt zwei Instanzen derselben Ablaufverfolgungsnummer, aber zwei unterschiedliche IDs für dieselbe Ablaufverfolgungsnummer –

+0

Die erste groupby prüft auf doppelte ID, die zweite prüft auf doppelte Trace. – Allen

Verwandte Themen