【问题标题】:Pandas - Delete cells based on ranking within columnPandas - 根据列内的排名删除单元格
【发布时间】:2014-10-15 16:57:01
【问题描述】:

我想根据它们在列中的相对排名来删除值。具体来说,我想隔离几列中的 X 最高值和 X 最低值。因此,如果 X=2 并且我的数据框如下所示:

ID    Val1    Val2    Val3    
001   2       8       14      
002   10      15      8
003   3       1       20
004   11      11      7
005   14      4       19

输出应如下所示:

ID    Val1    Val2    Val3    
001   2       NaN     NaN      
002   NaN     15      8
003   3       1       20
004   11      11      7
005   14      4       19

我知道我可以使用以下方法制作一个子表来隔离高低等级:

df = df.sort('Column Name')
df2 = df.head(X) # OR: df.tail(X)

我认为我可以使用以下方法清除这些子表中的其他列的值:

df2['Other Column'] = np.NaN
df2['Other Column B'] = np.NaN

然后,当其中一个表中有数据时,以替换 NaN 值的方式将子表重新合并在一起。我试过了:

df2.update(df3) # df3 is a sub-table made the same way as df2 using a different column

仅更新 df2 中已存在的行。

我试过了:

out = pd.merge(df2, df3, how='outer')

当一行出现在 df2 和 d3 中时,它给了我单独的行

我试过了:

out = df2.combine_first(df3)

在某些情况下用找到的 NaN 值覆盖了数值,使其不合适。

必须有办法做到这一点:只要值不在该列中的 X 个最高值或 X 个最低值之列,我想插入带有 NaN 值的原始数据框。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    有趣的问题,您可以在每列的排序值中获取每列值的索引(这里在maskDataFrame),然后将具有索引的值保留在您定义的边界内。

    In [98]:
    print df
        Val1  Val2  Val3
    ID                  
    1      2     8    14
    2     10    15     8
    3      3     1    20
    4     11    11     7
    5     14     4    19
    In [99]:
    
    mask = df.apply(lambda x: np.searchsorted(sorted(x),x))
    print mask
        Val1  Val2  Val3
    ID                  
    1      0     2     2
    2      2     4     1
    3      1     0     4
    4      3     3     0
    5      4     1     3
    In [100]:
    
    print (mask<=1)|(mask>=(len(mask)-2))
         Val1   Val2   Val3
    ID                     
    1    True  False  False
    2   False   True   True
    3    True   True   True
    4    True   True   True
    5    True   True   True
    In [101]:
    
    print df.where((mask<=1)|(mask>=(len(mask)-2)))
        Val1  Val2  Val3
    ID                  
    1      2   NaN   NaN
    2    NaN    15     8
    3      3     1    20
    4     11    11     7
    5     14     4    19
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 2014-06-07
      • 1970-01-01
      • 2017-11-20
      • 2021-12-06
      • 1970-01-01
      • 2015-04-16
      • 2018-11-11
      相关资源
      最近更新 更多