2015-10-19 5 views
2

Я пытаюсь использовать drop_duplicates() функции в панде, но кажется, что панды разрушают уникальные данные:Почему панды бросают уникальные строки?

example.py

import pandas as pd 

data = pd.read_csv("test.csv") 
data = data.drop_duplicates(keep="first") 
data.to_csv("out.csv", index=False) 

test.csv

x,y 
3,5 
3,5 
4,9 
6,5 
7,0 
8,1 
0,2 

out.csv

x,y 
3,5 
4,9 
6,5 
8,1 
0,2 

Теперь я ожидал бы, что панды сбросят второй ряд 3,5, так как он на самом деле является дубликатом. Но почему это также падает 7,0 ?? Для меня это не имеет смысла. Это явление заставляет меня терять тысячи строк уникальных данных, когда я его увеличиваю. Я что-то не понимаю? Из documentation в нем говорится, что «по умолчанию используйте все столбцы», что, на мой взгляд, означает «только отбросить строку, если все столбцы одной строки соответствуют всем столбцам другой строки», но это явно не так ,

Я использую Python 3.4 и не уверен, что то же самое происходит на Python 2.X.

Edit:

Также воспроизводимые без использования CSV:

import pandas as pd 

raw_data = {'x': [7,6,3,3,4,8,0],'y': [0,6,5,5,9,1,2]} 
df = pd.DataFrame(raw_data, columns = ['x', 'y']) 

print("Before:", df) 
df = df.drop_duplicates() 
print("After:", df) 

Люди в github теперь знают об этом, так что пока это не фиксируется я предполагаю, что решение либо использовать обходной путь от комментариев или переключиться на Python 2.7.

+1

Вы правы, этот пример работает должным образом в Python 2, но производит * странные * Результаты в Python 3 –

+0

@bushmanov Хорошо знать, что я не схожу с ума. Может быть, я должен создать проблему в github. – RPGillespie

+0

Если 'x' и' y' являются именами столбцов, то «данные» должны быть, например, 3 5 не 3,5, а 3 и 5 - в строке, но в двух разных «столбцах». Можете ли вы показать, как выглядит 'dataframe', прежде чем вывести его в' csv'? –

ответ

-1

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

import pandas as pd 

data = pd.read_csv("data.csv") 

data = data.drop_duplicates(subset=['x'], keep="first") 

Sepcifying subset, кажется, сделать трюк.

x y 
0 3 5 
2 4 9 
3 6 5 
4 7 0 
5 8 1 
6 0 2 
Смежные вопросы