Python 如何在删除NAs时获取重复值的索引?结果索引小于原始数据帧
我正在与df合作: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.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,它们都是重复的,这是预期的结果。