我想替换列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
答案 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)
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