2016-05-31 8 views
8

データフレームは71列と30597行です。私はすべての非ナノエントリを1で、ナノ値を0で置き換えたいと思っています。データフレームのNaN以外のすべてのエントリを1で置き換え、すべてのNaNを0で置き換える方法

最初は、あまりにも多くの時間を費やしていたデータフレームの各値に対してfor-loopを試しました。

そして私はすべての非ヌル値0 を行うことができるように、自身にデータフレームのすべての値を減算することを意味しかし、エラーが発生したとしてdata_new = data.subtract(データ)を使用dataframeには複数の文字列エントリがありました。 astypeによってintにブール値をキャストすると

+0

[すべてのNaN値をpandasデータフレームの列にあるゼロで置き換えるにはどうすればいいですか?](http://stackoverflow.com/questions/13295735/how-can-i-replace-all-the-私の答えをコピーしないでください。 –

答えて

4

使用notnull

print ((df.notnull()).astype('int')) 

サンプル:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'a': [np.nan, 4, np.nan], 'b': [1,np.nan,3]}) 
print (df) 
    a b 
0 NaN 1.0 
1 4.0 NaN 
2 NaN 3.0 

print (df.notnull()) 
     a  b 
0 False True 
1 True False 
2 False True 

print ((df.notnull()).astype('int')) 
    a b 
0 0 1 
1 1 0 
2 0 1 
9

あなたは、データフレームが別の方法NaNTrueが含まれていFalseである、df.notnull()の戻り値を取ることができます整数にキャストして、0を与えます。ここで、DataFrameはNaNとですそうでない場合は:

newdf = df.notnull().astype('int') 

あなたは本当に、これは動作しますが、元のデータフレームに書き込みたい場合は、次の

df.loc[~df.isnull()] = 1 # not nan 
df.loc[df.isnull()] = 0 # nan 
+0

申し訳ありませんが、私の答えをコピーしないでください。あなたのバージョンは私のものと同等だと思うので、必要ではないと思います。 – jezrael

+1

私はあなたの前にこの答えを掲載したことに気付きましたか? – fmarc

+0

はい、 'notnull()'ではありません。あなたの答えは '〜isnull()'でした。そしてそれは等しいので、あなたのソリューションは私のものと非常に良いと思います。 – jezrael

0

何が必要ないデータフレームの方法.fillna()があります。たとえば:

df = df.fillna(0) # Replace all NaN values with zero, returning the modified DataFrame 

または

df.fillna(0, inplace=True) # Replace all NaN values with zero, updating the DataFrame directly 
0

私はちょうど置き換えるのではなく、新しい列を作るお勧めします。必要に応じて、前の列を削除することはできますが、別の列を操作して列を作成する場合は、常に元の列を削除することができます。

df ['col1']が既存の列である場合

df['col2'] = df['col1'].apply(lambda x: 1 if not pd.isnull(x) else np.nan) 

ここでcol2は新しい列です。 col2に文字列のエントリがある場合にも機能するはずです。

0

用途:df.fillna(0)

2

ではNaNを埋めるために、私は、データ分析の多くを行うと操作を行う新/高速化する方法を見つけることに興味があります。私はjezraelの方法に遭遇したことはありませんでした。私はそれを通常の方法と比較することに興味がありました。注記:これはOPの質問に対する答えではなく、むしろjezraelの方法の効率性の実例です。これは答えではないので、人々が役に立たないと思ったらこの投稿を削除します(そして、忘却に落とし込まれた後!)。削除する必要があると思われる場合は、コメントを残してください。

適度なサイズのデータ​​フレームを作成し、df.notnull()。astype(int)メソッドと単純なインデックス作成(通常どおりに行う方法)の両方を使用して複数の置換を行いました。後者は約5倍遅いことが判明しました。大規模な交換を行う人のための単なる一例です。

from __future__ import division, print_function 

import numpy as np 
import pandas as pd 
import datetime as dt 


# create dataframe with randomly place NaN's 
data = np.ones((1e2,1e2)) 
data.ravel()[np.random.choice(data.size,data.size/10,replace=False)] = np.nan 

df = pd.DataFrame(data=data) 

trials = np.arange(100) 


d1 = dt.datetime.now() 

for r in trials: 
    new_df = df.notnull().astype(int) 

print((dt.datetime.now()-d1).total_seconds()/trials.size) 


# create a dummy copy of df. I use a dummy copy here to prevent biasing the 
# time trial with dataframe copies/creations within the upcoming loop 
df_dummy = df.copy() 

d1 = dt.datetime.now() 

for r in trials: 
    df_dummy[df.isnull()] = 0 
    df_dummy[df.isnull()==False] = 1 

print((dt.datetime.now()-d1).total_seconds()/trials.size) 

この収率はそれぞれ0.142秒および0.685秒である。優勝者は誰かが明らかです。

関連する問題