【问题标题】:Delete columns and rows containing specific values in pandas dataframe [duplicate]删除熊猫数据框中包含特定值的列和行[重复]
【发布时间】:2017-09-27 11:32:58
【问题描述】:

我有一个看起来像这样的熊猫数据框(但实际上要大得多):

           a    b    c    d    e      f      g     h    i    j

       0|  0    1    2    3    4    -500   -500    5    6    7 
       1|  2    3    4    5    6    -500   -500    6    5    4
       2|-500 -500 -500 -500 -500   -500   -500  -500 -500 -500
       3|  3    4    5    2    1    -500   -500    5    3    6

我只想删除包含 -500 (2) 的整行和整列(f 和 g)。我的数据框是自动生成的,我还不知道哪些列和行包含 -500。

有人知道怎么做吗?

谢谢!

【问题讨论】:

标签: python pandas dataframe filtering


【解决方案1】:
In [76]: mask = df.eq(-500)

In [77]: df.loc[~mask.all(1), ~mask.all()]
Out[77]:
   a  b  c  d  e  h  i  j
0  0  1  2  3  4  5  6  7
1  2  3  4  5  6  6  5  4
3  3  4  5  2  1  5  3  6

In [83]: mask = df.ne(-500)

In [85]: df = df.loc[mask.any(1), mask.any()]

In [86]: df
Out[86]:
   a  b  c  d  e  h  i  j
0  0  1  2  3  4  5  6  7
1  2  3  4  5  6  6  5  4
3  3  4  5  2  1  5  3  6

mask 是这样的:

In [87]: mask
Out[87]:
       a      b      c      d      e      f      g      h      i      j
0   True   True   True   True   True  False  False   True   True   True
1   True   True   True   True   True  False  False   True   True   True
2  False  False  False  False  False  False  False  False  False  False
3   True   True   True   True   True  False  False   True   True   True

【讨论】:

    【解决方案2】:

    这是一种 NumPy 方法,专门用于通过 open 1D 使用 numpy.ix_ 的数组有效执行这种跨维选择的性能 -

    def delete_rows_cols(df):
        a = df.values
        mask = a!=-500
        m0 = mask.any(0)
        m1 = mask.any(1)
        return pd.DataFrame(a[np.ix_(m1,m0)], df.index[m1], df.columns[m0])
    

    示例运行 -

    In [255]: df
    Out[255]: 
         a    b    c    d    e    f    g    h    i    j
    0    0    1    2    3    4 -500 -500    5    6    7
    1    2    3    4    5    6 -500 -500    6    5    4
    2 -500 -500 -500 -500 -500 -500 -500 -500 -500 -500
    3    3    4    5    2    1 -500 -500    5    3    6
    
    In [256]: delete_rows_cols(df)
    Out[256]: 
       a  b  c  d  e  h  i  j
    0  0  1  2  3  4  5  6  7
    1  2  3  4  5  6  6  5  4
    3  3  4  5  2  1  5  3  6
    

    运行时测试-

    # Setup input dataframe
    In [257]: arr = np.random.randint(0,100,(1000,1000))
    
    In [258]: arr[:,np.random.choice(1000,100,replace=0)] = -500
    
    In [259]: arr[np.random.choice(1000,100,replace=0)] = -500
    
    In [260]: df = pd.DataFrame(arr)
    
    # @MaxU's pandas soln step-1
    In [262]: mask = df.ne(-500)
    
    In [263]: %timeit df.ne(-500)
    1000 loops, best of 3: 606 µs per loop
    
    # @MaxU's pandas soln step-2
    In [264]: %timeit df.loc[mask.any(1), mask.any()]
    10 loops, best of 3: 21.1 ms per loop
    
    In [261]: %timeit delete_rows_cols(df)
    100 loops, best of 3: 3.75 ms per loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2019-06-19
      • 2016-09-09
      • 2021-04-01
      • 2023-03-16
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多