2015-03-05 21 views
5

Chcę otworzyć plik, przeczytać go, usunąć duplikaty w dwóch kolumnach pliku, a następnie dalej używać pliku bez duplikatów do wykonywania niektórych obliczeń. Aby to zrobić, używam pandas.drop_duplicates, który po upuszczeniu duplikatów również zrzuca wartości indeksowania. Na przykład po droping linii 1, plik1 plik2 się:Ponowne indeksowanie po pandas.drop_duplicates

file1: 
    Var1 Var2 Var3 Var4 
0 52  2  3  89 
1 65  2  3  43 
2 15  1  3  78 
3 33  2  4  67 

file2: 
    Var1 Var2 Var3 Var4 
0 52  2  3  89 
2 15  1  3  78 
3 33  2  4  67 

Aby dalej korzystać z plik2 jako dataframe muszę reindex go do 0, 1, 2, ...

Oto kod Jestem przy użyciu:

file1 = pd.read_csv("filename.txt",sep='|', header=None, names=['Var1', 'Var2', 'Var3', 'Var4']) 
file2 = file1.drop_duplicates(["Var2", "Var3"]) 
# create another variable as a new index: ni 
file2['ni']= range(0, len(file2)) # this is the line that generates the warning 
file2 = file2.set_index('ni') 

chociaż tras kodowych i daje dobre rezultaty, reindeksowania daje następujące ostrzeżenie:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    file2['ni']= range(0, len(file2)) 

Sprawdziłem link, ale nie wiem, jak zmienić kod. Wszelkie pomysły, jak to naprawić?

Odpowiedz

3

Pandas has a built in function to accomplish this task, który pozwoli Ci uniknąć rzucania błąd za pomocą alternatywy i prostsze podejście

Zamiast dodając nową kolumnę numerów sekwencyjnych, a następnie ustawienie indeks do tej kolumny, jak to było z :

file2['ni']= range(0, len(file2)) # this is the line that generates the warning 
file2 = file2.set_index('ni') 

zamiast tego można użyć:

file2 = file2.reset_index(drop=True) 

domyślne zachowanie .reset_index() jest pobranie bieżącego indeksu, wstawienie tego indeksu jako pierwszej kolumny ramki danych, a następnie zbudowanie nowego indeksu (zakładam, że logika jest taka, że ​​domyślne zachowanie bardzo ułatwia porównywanie starego z nowym indeksem, bardzo przydatne do kontroli poprawności). drop=True oznacza, że ​​zamiast zachowywać stary indeks jako nową kolumnę, po prostu pozbyć się go i zastąpić nowym indeksem, który wydaje się być tym, co chcesz.

wszystko razem, nowy kod mógłby wyglądać następująco

file1 = pd.read_csv("filename.txt",sep='|', header=None, names=['Var1', 'Var2', 'Var3', 'Var4']) 
file2 = file1.drop_duplicates(["Var2", "Var3"]).reset_index(drop=True) 

See this question as well