在熊猫数据框行中仅保留非Nan值的第一簇

时间:2020-01-29 19:29:05

标签: python-3.x pandas

如果我有这样的熊猫数据框:

      A     B     C     D     E     F
 0    1    NaN   NaN   NaN   NaN   NaN
 1    2     5     6     1    NaN    1
 2    2     3    NaN    1     4     1
 3    5     5     2     1     2     1
 4   NaN    2     3     4     1     2
 5   NaN   NaN    2    NaN   NaN    1

如何仅保留非NaN值的第一组,以便获得如下所示的熊猫数据框:

      A     B     C     D     E     F
 0    1    NaN   NaN   NaN   NaN   NaN
 1    2     5     6     1    NaN   NaN
 2    2     3    NaN   NaN   NaN   NaN
 3    5     5     2     1     2     1
 4   NaN    2     3     4     1     2
 5   NaN   NaN    2    NaN   NaN   NaN

消除NaN值之后的所有值。

2 个答案:

答案 0 :(得分:6)

我们可以创建一个蒙版。有点难以解释,所以我会慢慢走下去

m = (df.notnull().cummax(1) & df.isnull()).cummax(1)
df.mask(m)
     A    B    C    D    E    F
0  1.0  NaN  NaN  NaN  NaN  NaN
1  2.0  5.0  6.0  1.0  NaN  NaN
2  2.0  3.0  NaN  NaN  NaN  NaN
3  5.0  5.0  2.0  1.0  2.0  1.0
4  NaN  2.0  3.0  4.0  1.0  2.0
5  NaN  NaN  2.0  NaN  NaN  NaN

说明

# Row-wise True filling after/including first non-null value.
df.notnull().cummax(1)
       A      B     C     D     E     F
0   True   True  True  True  True  True
1   True   True  True  True  True  True
2   True   True  True  True  True  True
3   True   True  True  True  True  True
4  False   True  True  True  True  True
5  False  False  True  True  True  True

# Adding the `&` condition ensures first True value for each row is after the first 
# non-null group
df.notnull().cummax(1) & df.isnull()
       A      B      C      D      E      F
0  False   True   True   True   True   True
1  False  False  False  False   True  False
2  False  False   True  False  False  False
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True   True  False

# We now turn everything to True after the first, row-wise
(df.notnull().cummax(1) & df.isnull()).cummax(1)
       A      B      C      D      E      F
0  False   True   True   True   True   True
1  False  False  False  False   True   True
2  False  False   True   True   True   True
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True   True   True

答案 1 :(得分:4)

与Alollz逻辑不同,将library(dplyr) library(purrr) n <- 0.2 mget(ls(pattern= 'Data')) %>% map_int(~ .x %>% summarise_all(~ mean(between(., 0, 100)) >= n) %>% unlist %>% which %>% first) cumsum结合使用,第一个掩码是控制前导mask,在哪里将False掩码为NaN

NaN