2016-10-17 10 views
5

負の値をnanに置き換えたいのは、特定の列のみです。最も簡単な方法は次のようになります。パンダ:複数の列を条件付きで割り当てる方法は?

for col in ['a', 'b', 'c']: 
    df.loc[df[col ] < 0, col] = np.nan 

dfは、多くの列を持っている可能性があり、私は特定の列にこれをやってみたいです。

これを行う方法は1行にありますか?これは簡単だと思われますが、私は理解できませんでした。

答えて

11

私はあなたがこれよりもはるかに簡単に得るだろうとは思わない:

>>> 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 
6
使用 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 

enter image description here

cols = list('abc') 
df.loc[:, cols] = df[cols].where(df[cols].ge(0), np.nan) 
df 

enter image description here


あなたは同じことを行うために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 = 10000n = 100000

enter image description here

+0

@jezrael nice catch – piRSquared

5

ため

enter image description here

ため

は、ここでの方法です:あなたが使用することができます

df[df.columns.isin(['a', 'b', 'c']) & (df < 0)] = np.nan 
4

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 
1

:これを達成するために

df[['a', 'b', 'c']] = df[['a', 'b', 'c']].apply(lambda c: [x>0 and x or np.nan for x in c]) 
3

確かにマスクから目的の列を選択してください:

(df < 0)[['a', 'b', 'c']] 

このマスクはdf[(df < 0)[['a', 'b', 'c']]] = np.nanです。

関連する問題