2014-04-07 16 views
16

Jeśli chcesz usunąć indeks powielony w dataframe dodaje nie działa z oczywistych powodów:najszybszy sposób Drop powielane Index w Pandy DataFrame

myDF.drop_duplicates(cols=index) 

i

myDF.drop_duplicates(cols='index') 

szuka kolumna o nazwie „index”

Jeśli chcesz usunąć indeks mam zrobić:

myDF['index'] = myDF.index 
myDF= myDF.drop_duplicates(cols='index') 
myDF.set_index = myDF['index'] 
myDF= myDF.drop('index', axis =1) 

Czy istnieje skuteczniejszy sposób?

+1

http://stackoverflow.com/questions/13035764/remove-rows-with-duplicate-indices-pandas-dataframe-and- timeseries –

+1

@PaulH: Odpowiedź na twoje pytanie od Luciano jest taka sama jak moje pytanie tylko w jednej linii – RukTech

Odpowiedz

26

prostu: DF.groupby(DF.index).first()

+0

Podoba mi się ta metoda. Dziękuję Ci! @CT – RukTech

+0

@CT Zhu - Jeśli użyję tej metody, to łączę mój wątek z kolumną w jedną kolumnę. Nie chcę, żeby to się zdarzyło. Czy jest jakiś sposób obejścia tego? – liv2hak

+0

@ liv2hak, umysł zadać nowe pytanie z minimalnym przykładem zbioru danych? –

5

Można użyć numpy.unique uzyskać indeks unikatowych wartości i używać iloc aby te indeksy:

>>> df 
     val 
A 0.021372 
B 1.229482 
D -1.571025 
D -0.110083 
C 0.547076 
B -0.824754 
A -1.378705 
B -0.234095 
C -1.559653 
B -0.531421 

[10 rows x 1 columns] 

>>> idx = np.unique(df.index, return_index=True)[1] 
>>> df.iloc[idx] 
     val 
A 0.021372 
B 1.229482 
C 0.547076 
D -1.571025 

[4 rows x 1 columns] 
+2

To jest DUŻO szybsze ..... jeszcze szybciej, jeśli używasz df.ix [idx] – baconwichsand

16

do „powielona” metoda działa dla dataframes i serii. Wystarczy wybrać się na tych wierszy, które nie są oznaczone jako mające duplikatu indeksu:

df[~df.index.duplicated()] 
+0

Spowoduje to jednak usunięcie wszystkich duplikatów? –

+1

Zauważ, że jest to najszybsza metoda w testowanych przeze mnie przypadkach testowych: http://stackoverflow.com/questions/13035764/remove-rows-with-duplicate-indices-pandas-dataframe-and-timeseries/34297689#34297689 Możesz również odtworzyć zachowanie zaakceptowanej odpowiedzi dokładnie używając: 'df [~ df.index.duplicated (keep = 'first)]' – n8yoder