2016-07-27 5 views
4

なるように、他の変更、私はデータフレームを持って次のようにdfを:Pythonのパンダ:データがNaNの場合、0に変更、データフレームにおける1

row id name age url   
    1 e1 tom NaN http1 
    2 e2 john 25 NaN 
    3 e3 lucy NaN http3 
    4 e4 tick 29 NaN 

私がすることはNaNを変更したいです0、それ以外の場合は列の1:age、url。 私のコードは次のとおりですが、間違っています。

import Pandas as pd 

    df[['age', 'url']].applymap(lambda x: 0 if x=='NaN' else x) 

私は、次のような結果を取得したい:あなたの助けのための

row id name age url   
    1 e1 tom  0  1 
    2 e2 john 1  0 
    3 e3 lucy 0  1 
    4 e4 tick 1  0 

感謝を!

答えて

4

あなたはisnullによってfillna条件でwhereを使用することができます。

df[['age', 'url']] = df[['age', 'url']].where(df[['age', 'url']].isnull(), 1) 
             .fillna(0).astype(int) 
print (df) 

    row id name age url 
0 1 e1 tom 0 1 
1 2 e2 john 1 0 
2 3 e3 lucy 0 1 
3 4 e4 tick 1 0 

またはnumpy.whereisnullで:

df[['age', 'url']] = np.where(df[['age', 'url']].isnull(), 0, 1) 
print (df) 
    row id name age url 
0 1 e1 tom 0 1 
1 2 e2 john 1 0 
2 3 e3 lucy 0 1 
3 4 e4 tick 1 0 
notnullastype

最速ソリューション:

df[['age', 'url']] = df[['age', 'url']].notnull().astype(int) 
print (df) 
    row id name age url 
0 1 e1 tom 0 1 
1 2 e2 john 1 0 
2 3 e3 lucy 0 1 
3 4 e4 tick 1 0 

EDIT:

私はあなたのソリューションを修正してみてください。

df[['age', 'url']] = df[['age', 'url']].applymap(lambda x: 0 if pd.isnull(x) else 1) 
print (df) 
    row id name age url 
0 1 e1 tom 0 1 
1 2 e2 john 1 0 
2 3 e3 lucy 0 1 
3 4 e4 tick 1 0 

タイミング

len(df)=4k

In [127]: %timeit df[['age', 'url']] = df[['age', 'url']].applymap(lambda x: 0 if pd.isnull(x) else 1) 
100 loops, best of 3: 11.2 ms per loop 

In [128]: %timeit df[['age', 'url']] = np.where(df[['age', 'url']].isnull(), 0, 1) 
100 loops, best of 3: 2.69 ms per loop 

In [129]: %timeit df[['age', 'url']] = np.where(pd.notnull(df[['age', 'url']]), 1, 0) 
100 loops, best of 3: 2.78 ms per loop 

In [131]: %timeit df.loc[:, ['age', 'url']] = df[['age', 'url']].notnull() * 1 
1000 loops, best of 3: 1.45 ms per loop 

In [136]: %timeit df[['age', 'url']] = df[['age', 'url']].notnull().astype(int) 
1000 loops, best of 3: 1.01 ms per loop 
+0

感謝。私は明日の投票に基づいてそれを受け入れます。 – tktktk0711

+0

ああ、それは最高です。ありがとう! – tktktk0711

+0

あなたは私に大きな助けです。実際には、データフレームは大きなデータフレームです、速度は私にとって重要です! – tktktk0711

4

使用np.wherepd.notnullとして不足していると、有効な要素を交換します0および012それぞれ:あなたの親切な答えを

In [90]: 
df[['age', 'url']] = np.where(pd.notnull(df[['age', 'url']]), 1, 0) 
df 

Out[90]: 
    row id name age url 
0 1 e1 tom 0 1 
1 2 e2 john 1 0 
2 3 e3 lucy 0 1 
3 4 e4 tick 1 0 
+0

あなたの種類の答えに感謝! – tktktk0711

2
df.loc[:, ['age', 'url']] = df[['age', 'url']].notnull() * 1 
df 

enter image description here

+0

あなたの種類の答えに感謝します! – tktktk0711

関連する問題