Python 如何从数据帧中删除重复行,其中重复行具有NAN?
我有一个包含200多个特性的数据框架,我将数据集的一部分放在其中以显示问题:Python 如何从数据帧中删除重复行,其中重复行具有NAN?,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,我有一个包含200多个特性的数据框架,我将数据集的一部分放在其中以显示问题: index ID X1 X2 Date1 Y1 0 2 324 634 2016-01-01 NaN 1 2 324 634 2016-01-01 1224.0 3 4 543 843 2017-02-01 654 4 4 543 84
index ID X1 X2 Date1 Y1
0 2 324 634 2016-01-01 NaN
1 2 324 634 2016-01-01 1224.0
3 4 543 843 2017-02-01 654
4 4 543 843 2017-02-01 NaN
5 5 523 843 2015-09-01 NaN
6 5 523 843 2015-09-01 1121.0
7 6 500 897 2015-11-01 NaN
正如您所看到的,这些行是重复的(在ID、X1、X2和Date1中),我想删除其中一个在ID、X1、X2、Date1和Y1中类似的行,其中包含NaN。因此,我想要的数据帧应该是:
index ID X1 X2 Date1 Y1
1 2 324 634 2016-01-01 1224.0
3 4 543 843 2017-02-01 654
6 5 523 843 2015-09-01 1121.0
7 6 500 897 2015-11-01 NaN
有人知道我怎么处理吗 只需使用
drop\u duplicates
功能即可
使用“Y1”上的
排序\u值
将NaN移动到数据帧的底部,然后使用删除重复项
:
df2 = (df.sort_values('Y1', na_position='last')
.drop_duplicates(['ID', 'X1', 'X2', 'Date1'], keep='first')
.sort_index())
df2
ID X1 X2 Date1 Y1
index
1 2 324 634 2016-01-01 1224.0
3 4 543 843 2017-02-01 654.0
6 5 523 843 2015-09-01 1121.0
7 6 500 897 2015-11-01 NaN
这不是仅仅是
df=df.dropna(['Y1'])
?实际上不是,因为可能还有其他行不重复并且也包含NAN。我已经编辑了我的问题。在这种情况下,X1=224和X2=634对应的行如何?那不也应该出现吗?嗯。。。那么,你能告诉我02324634 2016-01-01 NaN发生了什么事以及它去了哪里吗?如果您能解释它去了哪里,这将帮助我给出一个实际可行的答案。应该删除第0行,因为它与第1行类似。第0行和第1行之间的唯一区别是最后一个特征“Y1”。换句话说,我有兴趣删除“Y1”中包含NaN的冗余行。我已经尝试了此代码,但此代码可能会删除包含Y1=1121.0的行。@Spedo add please您的数据帧的源我已编辑了我发布的数据帧。这正是我的数据帧的来源。@Spedo给我5分钟时间,我会解决这个问题answer@Spedo在使用groupBy之前对数据进行排序,然后删除重复项,但我不知道ASC或DESC请尝试这两种方法examplesperfect,它可以工作,tnx。由于我的原始数据帧包含更多的tan 100特性,有没有办法不使用--drop_duplicates(['ID','X1','X2','Date1']--?@Spedo Yes,您可以执行类似于drop_duplicates(df.columns.difference(['Y1']).tolist()
df2 = (df.sort_values('Y1', na_position='last')
.drop_duplicates(['ID', 'X1', 'X2', 'Date1'], keep='first')
.sort_index())
df2
ID X1 X2 Date1 Y1
index
1 2 324 634 2016-01-01 1224.0
3 4 543 843 2017-02-01 654.0
6 5 523 843 2015-09-01 1121.0
7 6 500 897 2015-11-01 NaN