2017-08-25 2 views
1

Ich habe eine ziemlich einfache Frage, aber ich kann keinen sauberen Weg finden, es zu tun. Ich möchte eine Reihe von Zeilen aus meinem Datenrahmen löschen, basierend auf ihrem Wert in einer bestimmten Spalte (id), aber ich möchte nur ein Vorkommen nach dem anderen löschen (vorzugsweise zufällig). Hier ein Beispiel:Python Pandas Dataframe Zeilen nach Wert aus Liste löschen

Ich habe die folgende Liste von IDs, die ich löschen wollen:

idsToDelete = [1,2,2,3,3] 

Mit anderen Worten, ich möchte eine zufällige Reihe mit id = 1, zwei zufällige Zeilen löschen mit der ID 2 und zwei zufällige Zeilen mit id 3.

ich habe die follwoing Datenrahmen:

list1 = np.array([[1,0],[1,0],[2,0],[2,0],[2,0],[2,0],[3,0],[3,0],[3,0]]) 
df = pd.DataFrame(list1, columns=["id","class"]) 
 
id | class 
------ | ------ 
1 | 0 
1 | 0 
2 | 0 
2 | 0 
2 | 0 
2 | 0 
3 | 0 
3 | 0 
3 | 0 

Mein Ziel ist es, diesen Datenrahmen zu bekommen:

 
id | class 
------ | ------ 
1 | 0 
2 | 0 
2 | 0 
3 | 0 

Irgendwelche Ideen?

+0

Nein, ich will nicht um Duplikate löschen, würde ich mit 1-ID einer beliebigen Zeile löschen möge, 3 zufällige Zeilen mit id 2 und 2 zufällige Reihen mit ID 3. Hypothetisch könnte es Doppelungen in der Ausgabe geben. Ich ändere das Beispiel, um es klarer zu machen. – SirTobi

Antwort

1

Dies funktioniert, aber es ist nicht zufällig:

for currentID in idsToDelete: 
    df = df.drop(df[df.id == currentID].index[0]) 
+1

Und passiert auch iterativ. yeesh. –

+0

Ja, das ist genau mein Punkt :( – SirTobi

+0

Sie könnten dies umdrehen - übergeben Sie eine Liste von 'ids', die Sie _want_ behalten möchten. Dafür gibt es eine vektorisierte Lösung. –

Verwandte Themen