Как получить индекс дублированных значений при отбрасывании NA?Результирующий индекс меньше исходного кадра данных - PullRequest
1 голос
/ 08 июля 2019

Я работаю с df:

df.shape[0]

82208

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

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


indx

0         True
1         True
2        False
3        False
4         True
5         True

indx.shape[0]

73797

Я не могу использовать это противоригинальный df, использующий df[indx], так как они не совпадают по размеру, как вы можете видеть из .shape[0].Я тоже пытался использовать indx.index, но получаю:


df[indx.indx]

KeyError: "None of [Int64Index([    0,     1,     2,     3,     4,     5,     6,     7,     8,\n                9,\n            ...\n            82198, 82199, 82200, 82201, 82202, 82203, 82204, 82205, 82206,\n            82207],\n           dtype='int64', length=73797)] are in the [columns]"

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

edit: было предложено проверить дубликат поста, но это не отвечает на мой вопрос. Дубликат - это просто базовая индексация.

Моя проблема заключается в том, что при создании нового индекса / логического ряда 'indx' исходные индексы df теряются.Поэтому его нельзя использовать для индексации df.

edit: другое решение для этого - переиндексирование, чтобы оно соответствовало размеру df.


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


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

indx = indx.reindex(df.index, fill_value=False)


df[indx ]

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

1 Ответ

1 голос
/ 08 июля 2019

Вместо того, чтобы отбрасывать nans и затем создавать логическую маску, добавьте к логической маске, которая возвращает False для nan, чтобы у вас были сохранены все индексы, но false для nans.используя df.isna() и df.any() для axis=1, мы можем использовать следующее:

cols=['firstname', 'lastname', 'email']
index=(~df[cols].isna().any(1)&df.duplicated(subset=cols, keep=False))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...