2015-03-05 2 views
5

Я хочу открыть файл, прочитать его, удалить дубликаты в двух столбцах файла, а затем использовать файл без дубликатов для выполнения некоторых вычислений. Для этого я использую pandas.drop_duplicates, который после удаления дубликатов также снижает значения индексации. Например, после строки 1 падают, file1 file2 становится:Reindexing after 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 

Для дальнейшего использования file2 как dataframe мне нужно проиндексировать его в 0, 1, 2, ...

Вот код, я с помощью:

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') 

Хотя прогонов кода и дает хорошие результаты, переиндексации, дает следующее предупреждение:

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)) 

Я проверил ссылку, но не могу понять, как изменить свой код. Есть какие нибудь идеи как это починить?

ответ

3

Pandas has a built in function to accomplish this task, что позволит вам избежать брошенной ошибки с помощью альтернативы, и проще, подход

Вместо добавления нового столбца последовательных чисел, а затем установить индекс для этого столбца, как вы делали с :

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

Вы можете вместо этого использовать:

file2 = file2.reset_index(drop=True) 

поведение по умолчанию .reset_index() заключается в том, чтобы взять текущий индекс, вставить этот индекс в качестве первого столбца кадра данных, а затем построить новый индекс (я предполагаю, что логика здесь заключается в том, что поведение по умолчанию позволяет очень легко сравнивать старый или новый индекс, очень полезно для проверок здравомыслия). drop=True означает вместо сохранения старого индекса в качестве нового столбца, просто избавитесь от него и замените его новым индексом, который походит на то, что вы хотите.

все вместе, ваш новый код может выглядеть следующим образом

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

Смежные вопросы