【问题标题】:Remove Certain rows above NAN values删除 NAN 值上方的某些行
【发布时间】:2016-08-17 06:05:42
【问题描述】:

我有100K 4 列的行数据。其中一列包含许多 NAN 值。我想删除带有NAN 的行和低于NAN 值的10 行。

【问题讨论】:

  • 你认为是高还是低?

标签: python-3.x pandas dataframe cumsum


【解决方案1】:

您可以将boolean indexing 与掩码一起使用,它会在NaN 值之后计算行数:

df = pd.DataFrame(np.arange(120).reshape(30,4),columns=list('ABCD'))
df.ix[2:5,'A'] = np.nan
df.ix[20:23,'A'] = np.nan
print (df)
        A    B    C    D
0     0.0    1    2    3
1     4.0    5    6    7
2     NaN    9   10   11
3     NaN   13   14   15
4     NaN   17   18   19
5     NaN   21   22   23
6    24.0   25   26   27
7    28.0   29   30   31
8    32.0   33   34   35
9    36.0   37   38   39
10   40.0   41   42   43
11   44.0   45   46   47
12   48.0   49   50   51
13   52.0   53   54   55
14   56.0   57   58   59
15   60.0   61   62   63
16   64.0   65   66   67
17   68.0   69   70   71
18   72.0   73   74   75
19   76.0   77   78   79
20    NaN   81   82   83
21    NaN   85   86   87
22    NaN   89   90   91
23    NaN   93   94   95
24   96.0   97   98   99
25  100.0  101  102  103
26  104.0  105  106  107
27  108.0  109  110  111
28  112.0  113  114  115
29  116.0  117  118  119
a = df.A.notnull()
b = (a.cumsum()-a.cumsum().where(~a).ffill().fillna(0)).where(df.A.isnull().cumsum() != 0)
print (b)
0      NaN
1      NaN
2      0.0
3      0.0
4      0.0
5      0.0
6      1.0
7      2.0
8      3.0
9      4.0
10     5.0
11     6.0
12     7.0
13     8.0
14     9.0
15    10.0
16    11.0
17    12.0
18    13.0
19    14.0
20     0.0
21     0.0
22     0.0
23     0.0
24     1.0
25     2.0
26     3.0
27     4.0
28     5.0
29     6.0
Name: A, dtype: float64
#get rows without 5 below NaN and without NaN in column A
print (df[b > 5])
        A      B      C      D
11   44.0   45.0   46.0   47.0
12   48.0   49.0   50.0   51.0
13   52.0   53.0   54.0   55.0
14   56.0   57.0   58.0   59.0
15   60.0   61.0   62.0   63.0
16   64.0   65.0   66.0   67.0
17   68.0   69.0   70.0   71.0
18   72.0   73.0   74.0   75.0
19   76.0   77.0   78.0   79.0
29  116.0  117.0  118.0  119.0

【讨论】:

    【解决方案2】:

    借用jezrael的设置

    df = pd.DataFrame(np.arange(120).reshape(30,4),columns=list('ABCD'))
    df.ix[2:5,'A'] = np.nan
    df.ix[20:23,'A'] = np.nan
    

    使用pd.concatany

    # grab null rows
    isnull = df.A.isnull()
    
    # get subsequent 10 rows after null
    mask = pd.concat([isnull.shift(i) for i in range(11)], axis=1).any(1)
    
    # boolean mask
    df[~mask]
    

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2017-11-05
      相关资源
      最近更新 更多