Python 如何在删除NAs时获取重复值的索引?结果索引小于原始数据帧

Python 如何在删除NAs时获取重复值的索引?结果索引小于原始数据帧,python,pandas,Python,Pandas,我正在与df合作: df.shape[0] 82208 我想根据firstname、lastname和email为副本编制索引: indx = (df.dropna(subset=['firstname', 'lastname', 'email']) .duplicated(subset=['firstname', 'lastname', 'email'], keep=False)) indx 0 True 1 True 2

我正在与df合作:

df.shape[0]

82208

我想根据firstname、lastname和email为副本编制索引:

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[indx]
对原始df使用此选项,因为它们的大小不匹配,您可以从
.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
I似乎重置了它的索引。我想得到的是第一个df中哪里有重复的索引。我猜我的问题与生成索引时的
dropna()
有关

编辑:有人建议检查一篇重复的文章,但这并不能回答我的问题。重复的只是基本的索引

我的问题是,在生成新的索引/布尔序列时,原始的
df
索引丢失。因此,它不能用于索引
df

编辑:另一个解决方案是重新编制索引,使其与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

不要删除nan然后创建布尔掩码,而是添加到布尔掩码,该掩码为
nan
返回False,因此保留所有索引,但nan为False。使用
df.isna()

cols=['firstname', 'lastname', 'email']
index=(~df[cols].isna().any(1)&df.duplicated(subset=cols, keep=False))

你想要df.loc[indx]
吗?是的,那就好了。还有一件事,如果您不想要nan值,为什么不将其作为
False
返回,而不是删除它们:
indx=(~df[['firstname','lastname','email']].isna().any(1)&df.duplicated(subset=['firstname','lastname','email'],keep=False))
谢谢,这似乎有效,只是在csv中快速检查一下。你能找出我的版本不起作用的任何原因吗?嗨@anky_91,你的版本对我有效。检查CSV,它们都是重复的,这是预期的结果。