在第一个非纳米值

时间:2018-01-08 11:58:50

标签: python

我有一个包含多个列的数据框和一个系列,其值是数据帧的第一个非nan值的索引:

dataframe x:

    a    b    c    d    e     f    g    h 
1   nan  nan  2    nan  nan  nan  nan  nan
2   nan  2    nan  10   23   nan  nan  nan
3   3    nan  23   42   232  3    nan  5

系列y:

a   3
b   2
c   1
d   2
e   2
f   3
g   nan
h   3

现在我想在第一个非纳米值(包括第一个非纳米值)之后用系列的值(其值是数据帧x的第一个非纳米值的索引)分配0以及所有值)

结果是

    a    b    c    d    e     f    g    h 
1   nan  nan  0    nan  nan  nan  nan  nan
2   nan  0    0    0    0    nan  nan  nan
3   0    0    0    0    0    0    nan  0

我使用applymap来处理它,但是applymap似乎没有处理索引信息,这里是我的代码:

def mycode(x,y)
if x.index<=Y:
        return 0
    else:
        return x

cal = x.applymap(lambda x: mycode(x,y))

1 个答案:

答案 0 :(得分:0)

您可以将ffillfillnamethod='ffill')与clip一起使用:

x = x.ffill().clip(0,0)

使用布尔掩码和where或的替代解决方案 mask

x = x.where(x.ffill().isnull(), 0)
x = x.mask(x.ffill().notnull(), 0)
print (x)
     a    b    c    d    e    f   g    h
1  NaN  NaN  0.0  NaN  NaN  NaN NaN  NaN
2  NaN  0.0  0.0  0.0  0.0  NaN NaN  NaN
3  0.0  0.0  0.0  0.0  0.0  0.0 NaN  0.0

详情:

print (x.ffill())
     a    b     c     d      e    f   g    h
1  NaN  NaN   2.0   NaN    NaN  NaN NaN  NaN
2  NaN  2.0   2.0  10.0   23.0  NaN NaN  NaN
3  3.0  2.0  23.0  42.0  232.0  3.0 NaN  5.0

print (x.ffill().isnull())
       a      b      c      d      e      f     g      h
1   True   True  False   True   True   True  True   True
2   True  False  False  False  False   True  True   True
3  False  False  False  False  False  False  True  False