Почему этот код дедупликации не работает, когда я соединяю его вместе? - PullRequest
3 голосов
/ 10 июля 2019

Я хочу выбрать дубликаты в этом фрейме данных:

df = pd.DataFrame({'firstname':['stack','Bar Bar',np.nan,'Bar Bar','john','mary','jim'],
                   'lastname':['jim','Bar','Foo Bar','Bar','con','sullivan','Ryan'],
                   'email':[np.nan,'Bar','Foo Bar','Bar','john@com','mary@com','Jim@com']})

print(df)

  firstname  lastname     email
0     stack       jim       NaN
1   Bar Bar       Bar       Bar
2       NaN   Foo Bar   Foo Bar
3   Bar Bar       Bar       Bar
4      john       con  john@com
5      mary  sullivan  mary@com
6       jim      Ryan   Jim@com

Этот метод работает нормально:

df = df.dropna(subset=['firstname', 'lastname', 'email'])

df = df[df.duplicated(subset=['firstname', 'lastname', 'email'], keep=False)]

print(df)

  firstname lastname email
1   Bar Bar      Bar   Bar
3   Bar Bar      Bar   Bar

Принимая во внимание, что если я объединяю операции в цепочку, он не работает:

dupes = (df.dropna(subset=['firstname', 'lastname', 'email'])
                 .duplicated(subset=['firstname', 'lastname', 'email'], keep=False))

df = df[dupes]

IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match

Должен ли я вообще избегать цепочек, как это, и просто быть простым?Что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Это ожидается.

Проблема во втором решении - фильтр с уже отфильтрованными значениями, поэтому выходной индекс отличается от исходного индекса, поэтому возникла ошибка.

print(df)
  firstname  lastname     email
0     stack       jim       NaN
1   Bar Bar       Bar       Bar
2       NaN   Foo Bar   Foo Bar
3   Bar Bar       Bar       Bar
4      john       con  john@com
5      mary  sullivan  mary@com
6       jim      Ryan   Jim@com

dupes = (df.dropna(subset=['firstname', 'lastname', 'email'])
                 .duplicated(subset=['firstname', 'lastname', 'email'], keep=False))

print(dupes)
1     True
3     True
4    False
5    False
6    False
dtype: bool

В первом примере вы фильтруете уже отфильтрованные данные, поэтому индекс такой же и работает хорошо:

df = df.dropna(subset=['firstname', 'lastname', 'email'])
print(df)
  firstname  lastname     email
1   Bar Bar       Bar       Bar
3   Bar Bar       Bar       Bar
4      john       con  john@com
5      mary  sullivan  mary@com
6       jim      Ryan   Jim@com

print(df.duplicated(subset=['firstname', 'lastname', 'email'], keep=False))
1     True
3     True
4    False
5    False
6    False
dtype: bool


df = df[df.duplicated(subset=['firstname', 'lastname', 'email'], keep=False)]
print(df)
  firstname lastname email
1   Bar Bar      Bar   Bar
3   Bar Bar      Bar   Bar

Возможное решение: Series.reindex:

dupes1 = dupes.reindex(df.index, fill_value=False)
print(dupes1)
0    False
1     True
2    False
3     True
4    False
5    False
6    False
dtype: bool

dupes1 = dupes.reindex(df.index, fill_value=False)

df = df[dupes1]
print(df)
  firstname lastname email
1   Bar Bar      Bar   Bar
3   Bar Bar      Bar   Bar
1 голос
/ 10 июля 2019

В первом примере вы обновили фрейм данных, назначив его. Если вы напечатаете его после удаления, вы увидите, что индекс изменился:

df = df.dropna(subset=['firstname', 'lastname', 'email'])
print(df)

    firstname  lastname     email
1   Bar Bar       Bar       Bar
3   Bar Bar       Bar       Bar
4      john       con  john@com
5      mary  sullivan  mary@com
6       jim      Ryan   Jim@com

Проблема с цепочечными операциями заключается в том, что вы не изменили индекс своего фрейма данных, но в вашей серии dupes меньше строк.

dupes =  df.dropna(subset=['firstname', 'lastname', 'email']).duplicated(subset=['firstname', 'lastname', 'email'], keep=False)
print(dupes)
print(df)

1     True
3     True
4    False
5    False
6    False
dtype: bool

  firstname  lastname     email
0     stack       jim       NaN
1   Bar Bar       Bar       Bar
2       NaN   Foo Bar   Foo Bar
3   Bar Bar       Bar       Bar
4      john       con  john@com
5      mary  sullivan  mary@com
6       jim      Ryan   Jim@com

Когда вы пытаетесь получить строки из Dataframe путем индексации с использованием серии dupes, возникает ошибка, поскольку индекс не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...