2017-01-09 3 views
1

Я пытаюсь удалить дубликаты из двух столбцов. Как видно ниже, Алабама и Аляска.Pandas: невозможно обнаружить дубликаты из двух столбцов

enter image description here

Однако, когда я запрашиваю ниже, он не обнаруживает дубликаты. То же самое, когда я использую drop_duplicates(). Я проверил, что нет белых пробелов, поскольку они имеют одинаковую длину символа. Кто-нибудь знает, что случилось?

enter image description here

EDIT: Добавлен пример кода ниже. Результат тот же, без пробелов, не может обнаружить дубликаты.

list1=['Alabama','Alabama','Alabama','Alabama','Alaska'] 
list2=['Alabama','Auburn','Florence','Jacksonville','Alaska'] 
df=pd.DataFrame(list1, columns=['States']) 
df['Region']=pd.DataFrame(list2) 

df.duplicated() 
+0

Вы должны будете размещать сырье данных и кода, чтобы другие пытались воспроизвести это, вы разместили изображение, которое никто не может копировать, где нет дубликатов. – EdChum

+0

Добавлен образец кода! Благодаря! – Jake

ответ

2

Я думаю, что вам нужно ne для сравнения столбцов:

df[df['States'].ne(df['Region'])] 

тайминги:

df = pd.concat([df]*100000).reset_index(drop=True) 

In [353]: %timeit (df[df['States'].ne(df['Region'])]) 
10 loops, best of 3: 23.7 ms per loop 

In [354]: %timeit (df[df['States'] != df['Region']]) 
10 loops, best of 3: 88.6 ms per loop 
+0

Привет, я проверил ... нет белых пробелов ~ Добавил пример кода для людей, чтобы попробовать тоже ~ – Jake

+0

Извините, я ошибся. Я добавляю еще одно более быстрое решение в больших кадрах данных. – jezrael

+0

О, это круто ~ примет урс как ответ, так как его быстрее ~ спасибо u – Jake

1

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

In [93]: 
df[df['States'] != df['Region']] 

Out[93]: 
    States  Region 
1 Alabama  Auburn 
2 Alabama  Florence 
3 Alabama Jacksonville 

duplicated ищет дублированные значения в одном столбце или все столбцы в совокупности, она не здесь, потому что «Алабама» появляется только один раз в одной строке, если бы он появится на в нескольких строках, то было бы удалил их

Обратите внимание, что существует встроенный метод ne, что означает not equal, который является более быстрым, но, возможно, менее читаемым.

+0

проклятье, спасибо! почему не работает pandas drop_duplicates? Есть идеи? – Jake

+0

@Jake пожалуйста, мой обновленный ответ относительно 'drop_duplicates' – EdChum

+0

ohh, ok ~ спасибо. У удалось описать это очень четко. * Высоко цените свою помощь – Jake

1

Метод pd.DataFrame.duplicated() обнаруживает дублированные строки во всем кадре данных. Однако он не обнаруживает повторяющиеся значения внутри строк, которые вам нужны.

1

, если вы хотите удалить, вы можете получить индекс и удалить его с помощью индекса

list1 = ['Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alaska'] 
list2 = ['Alabama', 'Auburn', 'Florence', 'Jacksonville', 'Alaska'] 
df = pd.DataFrame(list1, columns=['States']) 
df['Region'] = pd.DataFrame(list2) 

index_list = df[df['States'] == df['Region']].index.tolist() 
df = df.drop(df.index[index_list]) 

print(df) 

выход ниже

States  Region 
1 Alabama  Auburn 
2 Alabama  Florence 
3 Alabama Jacksonville 

df.drop_duplicates работал построчно, так что если есть более 1 строки содержат одно и то же значение, оно будет удалено пример ниже

до drop_duplicate

States  Region 
0 Alabama  Alabama 
1 Alabama  Auburn 
2 Alabama  Florence 
3 Alabama Jacksonville 
4 Alaska  Alaska 
5 Alaska  Alaska 
6 Alaska  Alaska 

строки 4,5,6 точно так же, так что все строки, кроме строки с номером 4, будут удалены, после drop_duplicates ФР будет выглядеть следующим образом

States  Region 
0 Alabama  Alabama 
1 Alabama  Auburn 
2 Alabama  Florence 
3 Alabama Jacksonville 
4 Alaska  Alaska