Python 如何从数据帧中删除重复行,其中重复行具有NAN?

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

我有一个包含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  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