通过函数更新列的非空值

时间:2019-05-20 14:34:25

标签: pandas

我想替换列myCol的非空值。一元函数myFunc返回新值。

这是我的解决方法

t['myCol']= t.loc[t['myCol'].notna(), 'myCol'].apply(myFunc)

是否有一种更简单的解决方案,无需重复三次文字myCol

为了进行比较,如果myFunc接受向量作为输入,这将是q/kdb+中的解决方案:

t: update myFunc myCol from t where not null myCol

如果myFunc仅允许标量,则

t: update myFunc each myCol from t where not null myCol

1 个答案:

答案 0 :(得分:3)

pandas.DataFrame.mask

第一个参数是条件,第二个参数是在条件为True的那些地方要做什么。而且,mask有一个inplace参数使调用简洁。

t.mask(pd.notna, myFunc, inplace=True)  # For whole DataFrame

t.myCol.mask(pd.notna, myFunc, inplace=True)  # For just `myCol`

t.myCol.mask(pd.notna, lambda s: s.apply(myFunc), inplace=True)

MCVE

df = pd.DataFrame(dict(A=[1, 2, np.nan], B=[3, np.nan, 4]))

df.mask(pd.notna, lambda x: x * 10, inplace=True)
df

      A     B
0  10.0  30.0
1  20.0   NaN
2   NaN  40.0

这同样适用于带有pandas.Series.mask的特定列

df.A.mask(pd.notna, lambda x: x - 5, inplace=True)
df

      A     B
0   5.0  30.0
1  15.0   NaN
2   NaN  40.0