負の値をnan
に置き換えたいのは、特定の列のみです。最も簡単な方法は次のようになります。パンダ:複数の列を条件付きで割り当てる方法は?
for col in ['a', 'b', 'c']:
df.loc[df[col ] < 0, col] = np.nan
df
は、多くの列を持っている可能性があり、私は特定の列にこれをやってみたいです。
これを行う方法は1行にありますか?これは簡単だと思われますが、私は理解できませんでした。
負の値をnan
に置き換えたいのは、特定の列のみです。最も簡単な方法は次のようになります。パンダ:複数の列を条件付きで割り当てる方法は?
for col in ['a', 'b', 'c']:
df.loc[df[col ] < 0, col] = np.nan
df
は、多くの列を持っている可能性があり、私は特定の列にこれをやってみたいです。
これを行う方法は1行にありますか?これは簡単だと思われますが、私は理解できませんでした。
私はあなたがこれよりもはるかに簡単に得るだろうとは思わない:
>>> df = pd.DataFrame({'a': np.arange(-5, 2), 'b': np.arange(-5, 2), 'c': np.arange(-5, 2), 'd': np.arange(-5, 2), 'e': np.arange(-5, 2)})
>>> df
a b c d e
0 -5 -5 -5 -5 -5
1 -4 -4 -4 -4 -4
2 -3 -3 -3 -3 -3
3 -2 -2 -2 -2 -2
4 -1 -1 -1 -1 -1
5 0 0 0 0 0
6 1 1 1 1 1
>>> df[df[cols] < 0] = np.nan
>>> df
a b c d e
0 NaN NaN NaN -5 -5
1 NaN NaN NaN -4 -4
2 NaN NaN NaN -3 -3
3 NaN NaN NaN -2 -2
4 NaN NaN NaN -1 -1
5 0.0 0.0 0.0 0 0
6 1.0 1.0 1.0 1 1
loc
とwhere
cols = ['a', 'b', 'c']
df.loc[:, cols] = df[cols].where(df[cols].where.ge(0), np.nan)
デモ
df = pd.DataFrame(np.random.randn(10, 5), columns=list('abcde'))
df
cols = list('abc')
df.loc[:, cols] = df[cols].where(df[cols].ge(0), np.nan)
df
あなたは同じことを行うためにnumpyの
df[cols] = np.where(df[cols] < 0, np.nan, df[cols])
でそれをスピードアップすることができます。
タイミング
def gen_df(n):
return pd.DataFrame(np.random.randn(n, 5), columns=list('abcde'))
割り当てはこの重要な部分であるので、私は最初から各ループをdf
を作成します。 df
作成のタイミングも追加しました。n = 10000
n = 100000
np.where
それはワンライナーであることを持っている場合
In [47]:
df = pd.DataFrame(np.random.randn(5,5), columns=list('abcde'))
df
Out[47]:
a b c d e
0 0.616829 -0.933365 -0.735308 0.665297 -1.333547
1 0.069158 2.266290 -0.068686 -0.787980 -0.082090
2 1.203311 1.661110 -1.227530 -1.625526 0.045932
3 -0.247134 -1.134400 0.355436 0.787232 -0.474243
4 0.131774 0.349103 -0.632660 -1.549563 1.196455
In [48]:
df[['a','b','c']] = np.where(df[['a','b','c']] < 0, np.NaN, df[['a','b','c']])
df
Out[48]:
a b c d e
0 0.616829 NaN NaN 0.665297 -1.333547
1 0.069158 2.266290 NaN -0.787980 -0.082090
2 1.203311 1.661110 NaN -1.625526 0.045932
3 NaN NaN 0.355436 0.787232 -0.474243
4 0.131774 0.349103 NaN -1.549563 1.196455
:これを達成するために
df[['a', 'b', 'c']] = df[['a', 'b', 'c']].apply(lambda c: [x>0 and x or np.nan for x in c])
確かにマスクから目的の列を選択してください:
(df < 0)[['a', 'b', 'c']]
このマスクはdf[(df < 0)[['a', 'b', 'c']]] = np.nan
です。
@jezrael nice catch – piRSquared