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

enter image description here

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

enter image description here

РЕДАКТИРОВАТЬ : добавлен пример кода ниже. Результат тот же, без пробелов, не может обнаружить дубликаты.

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()
1
Jake 9 Янв 2017 в 19:00

4 ответа

Лучший ответ

Я думаю, что вам нужен 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
2
jezrael 9 Янв 2017 в 16:21

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

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 df будет выглядеть так

States        Region
0  Alabama       Alabama
1  Alabama        Auburn
2  Alabama      Florence
3  Alabama  Jacksonville
4   Alaska        Alaska
1
Po Stevanus Andrianta 9 Янв 2017 в 16:51

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

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

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

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

Обратите внимание, что есть встроенный метод {{X0} } что означает not equal, что быстрее, но, возможно, менее читабельно

1
EdChum - Reinstate Monica 9 Янв 2017 в 16:36

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

1
pansen 9 Янв 2017 в 16:25