a b c x a1 b1 c1 x1
0 aa ba ca 9 NaN NaN NaN 1
1 ab bb cb 9 NaN NaN NaN NaN
2 ac bc cd NaN NaN NaN NaN NaN
3 ad bd cd 9 1 NaN NaN NaN
4 ae be ce 9 NaN 2 NaN 12
5 af bf cf 9 NaN NaN 3 14
6 ag bg cg 9 3 NaN 1 45
a b c x a1 b1 c1 x1
0 aa ba ca 9 NaN NaN NaN 1
1 ab bb cb 9 NaN NaN NaN 9
2 ac bc cc NaN NaN NaN NaN NaN
3 ad bd cd 9 1 NaN NaN NaN
4 ae be ce 9 NaN 2 NaN 12
5 af bf cf 9 NaN NaN 3 14
6 ag bg cg 9 3 NaN 1 45
第 0 行:我不希望替换发生,当 中已经存在值时x1
,甚至当所有a1
,b1
和c1
都是NaN
s 时。1和2行:我要填写栏x1
与无论是在x
,只有只有当列a1
,b1
并且c1
是NaN
秒。
行3,4,5和6:我想列x1
留为是,当任何一个或从两列a1
,b1
并且c1
是NaN
秒。
有没有一种有效的方法来做这个操作?
我已经尝试过如this和this stackoverflow答案所示,但我收到广播错误,大概是因为我试图对多列进行检查。
这是我尝试过的:
np.where(np.isnan(df[['a1', 'b1', 'c1']].values), df['x'].values, df['x1'].values)
和我的错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-32-bb6a0f9faf18> in <module>
----> 1 np.where(np.isnan(df[['a', 'b', 'c']].values), df['x'].values, df['x1'].values)
<__array_function__ internals> in where(*args, **kwargs)
ValueError: operands could not be broadcast together with shapes (176213,6) (176213,) (176213,)
一种选择是any
在轴=1 上使用:
df['x1'] = np.where(df[['a1', 'b1', 'c1', 'x1']].any(axis=1), df['x1'], df['x'])
df
:
a b c x a1 b1 c1 x1
0 aa ba ca 9.0 NaN NaN NaN 1.0
1 ab bb cb 9.0 NaN NaN NaN 9.0
2 ac bc cd NaN NaN NaN NaN NaN
3 ad bd cd 9.0 1.0 NaN NaN NaN
4 ae be ce 9.0 NaN 2.0 NaN 12.0
5 af bf cf 9.0 NaN NaN 3.0 14.0
6 ag bg cg 9.0 3.0 NaN 1.0 45.0
通过@Jon Clements♦ 的另一种选择:
df.loc[~df[['a1', 'b1', 'c1', 'x1']].any(1), 'x1'] = df['x']
否定any
而不是使用的原因all
是,any
将认为NaN
是假的,而all
认为NaN
是真:
pd.Series([np.nan, np.nan]).any() # False
pd.Series([np.nan, np.nan]).all() # True
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句