【问题标题】:Pandas index column by boolean熊猫索引列按布尔值
【发布时间】:2015-03-24 05:35:48
【问题描述】:

我想保留具有“n”个或更多值的列。 例如:

> df = pd.DataFrame({'a': [1,2,3], 'b': [1,None,4]})

    a   b
0   1   1
1   2   NaN
2   3   4

3 rows × 2 columns

> df[df.count()==3]
IndexingError: Unalignable boolean Series key provided

> df[:,df.count()==3]
TypeError: unhashable type: 'slice'

> df[[k for (k,v) in (df.count()==3).items() if v]]

    a
0   1
1   2
2   3

这是最好的方法吗?看起来很可笑。

【问题讨论】:

    标签: python pandas boolean dataframe


    【解决方案1】:

    您可以使用条件列表推导来生成超出阈值的列(例如 3)。然后只需从数据框中选择这些列:

    # Create sample DataFrame
    df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 
                       'b': [1, None, 4, None, 2], 
                       'c': [5, 4, 3, 2, None]})
    
    >>> df_new = df[[col for col in df if df[col].count() > 3]]
    Out[82]: 
       a   c
    0  1   5
    1  2   4
    2  3   3
    3  4   2
    4  5 NaN
    

    【讨论】:

      【解决方案2】:

      使用count 生成布尔索引并将其用作列的掩码:

      In [10]:
      
      df[df.columns[df.count() > 2]]
      
      
      Out[10]:
         a
      0  1
      1  2
      2  3
      

      【讨论】:

        【解决方案3】:

        如果您想保留具有“n”个或更多值的列。对于我的示例,我将 n 值视为 4

        df = pd.DataFrame({'a': [1,2,3,4,6], 'b': [1,None,4,5,7],'c': [1,2,3,5,8]})
        print df
        
           a   b  c
        0  1   1  1
        1  2 NaN  2
        2  3   4  3
        3  4   5  5
        4  6   7  8
        
        print df[[i for i in xrange(0,len(df.columns)) if len(df.iloc[:,i]) - df.isnull().sum()[i] >4]]
        
        
           a  c
        0  1  1
        1  2  2
        2  3  3
        3  4  5
        4  6  8
        

        【讨论】:

          猜你喜欢
          • 2021-05-17
          • 2017-08-25
          • 2018-01-13
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 2016-01-15
          • 1970-01-01
          相关资源
          最近更新 更多