我目前的df看起来像这样:
IDnumber Subid Subsubid Date Originaldataindicator
a 1 x 2006 NaN
a 1 x 2007 NaN
a 1 x 2008 NaN
a 1 x 2008 1
原始数据推测器是这样一个事实的结果:这些观察中的一些创建是为了获得每个IDnumber的所有三年,而一些存在于原始数据集中。 我想要实现的是删除重复项并保存原始数据。请注意,originaldataindicator并不总是最后一次观察。 为了解决这个问题,我首先对Idnumber Date Originaldataindicator进行排序
但是当我使用时:
df=df.drop_duplicates(subset=['IDnumber', 'Subid', 'Subsubid', 'Date'])
什么都没发生,我仍然观察到副本。
df=df.drop_duplicates(subset=['IDnumber', 'Subid', 'Subsubid', 'Date'], inplace=True)
给了我一个空数据框。
我是否误解了drop_duplicates的作用?
为了避免混淆,这就是我想要的:
IDnumber Subid Subsubid Date Originaldataindicator
a 1 x 2006 NaN
a 1 x 2007 NaN
a 1 x 2008 1
数据包括数千个这样的ID
答案 0 :(得分:4)
我认为您需要groupby
和sort_values
,然后使用drop_duplicates
的参数keep=first
:
print df
IDnumber Subid Subsubid Date Originaldataindicator
0 a 1 x 2006 NaN
1 a 1 x 2007 NaN
2 a 1 x 2008 NaN
3 a 1 x 2008 1
4 a 1 x 2008 NaN
df = df.groupby(['IDnumber', 'Subid', 'Subsubid', 'Date'])
.apply(lambda x: x.sort_values('Originaldataindicator')).reset_index(drop=True)
print df
IDnumber Subid Subsubid Date Originaldataindicator
0 a 1 x 2006 NaN
1 a 1 x 2007 NaN
2 a 1 x 2008 1
3 a 1 x 2008 NaN
4 a 1 x 2008 NaN
df1=df.drop_duplicates(subset=['IDnumber', 'Subid', 'Subsubid', 'Date'], keep='first')
print df1
IDnumber Subid Subsubid Date Originaldataindicator
0 a 1 x 2006 NaN
1 a 1 x 2007 NaN
2 a 1 x 2008 1
或使用inplace
:
df.drop_duplicates(subset=['IDnumber','Subid','Subsubid','Date'], keep='first', inplace=True)
print df
IDnumber Subid Subsubid Date Originaldataindicator
0 a 1 x 2006 NaN
1 a 1 x 2007 NaN
2 a 1 x 2008 1
如果列Originaldataindicator
有多个值,请使用duplicated
(也许可以添加所有列IDnumber
,Subid
,Subsubid
,Date
)和isnull
:
print df
IDnumber Subid Subsubid Date Originaldataindicator
0 a 1 x 2006 NaN
1 a 1 x 2007 NaN
2 a 1 x 2008 NaN
3 a 1 x 2008 1
4 a 1 x 2008 1
print df[~((df.duplicated('Date',keep=False))&~(pd.notnull(df['Originaldataindicator'])))]
IDnumber Subid Subsubid Date Originaldataindicator
0 a 1 x 2006 NaN
1 a 1 x 2007 NaN
3 a 1 x 2008 1
4 a 1 x 2008 1
解释条件:
print df.duplicated('Date', keep=False)
0 False
1 False
2 True
3 True
4 True
dtype: bool
print (pd.isnull(df['Originaldataindicator']))
0 True
1 True
2 True
3 False
4 False
Name: Originaldataindicator, dtype: bool
print ~((df.duplicated('Date', keep=False)) & (pd.isnull(df['Originaldataindicator'])))
0 True
1 True
2 False
3 True
4 True
dtype: bool
答案 1 :(得分:3)
考虑一下:
df = pd.DataFrame({'a': [1, 2, 3, 3, 3], 'b': [1, 2, None, 1, None]})
然后
>>> df.sort_values(by=['a', 'b']).groupby(df.a).first()[['b']].reset_index()
a b
0 1 1
1 2 2
2 3 1
先按a
,然后b
对项目进行排序(从而最后推送每个组中的None
值),然后选择每个组的第一个项目。
我相信您可以根据问题的具体情况对其进行修改。