2017-09-07 4 views
1

私はcsvファイルを持っています。私はそれを読む:Python:特定の列が空の行を削除する方法/ NaN?

import pandas as pd 
data = pd.read_csv('my_data.csv', sep=',') 
data.head() 

それはのような出力があります。私はsms列がNaN /空であるすべての行を削除したい

id city department sms category 
01 khi  revenue  NaN  0 
02 lhr  revenue  good  1 
03 lhr  revenue  NaN  0 

を。効率的な方法は何ですか?

チェック NaN秒の列を指定するためのパラメータ subset
+0

OPが最も効率的な方法を必要とするため、質問を再開します。 – jezrael

答えて

4

使用dropna

data = data.dropna(subset=['sms']) 
print (data) 
    id city department sms category 
1 2 lhr revenue good   1 

boolean indexingnotnullのもう一つの解決策:

data = data[data['sms'].notnull()] 
print (data) 
    id city department sms category 
1 2 lhr revenue good   1 

代替queryと:

print (data.query("sms == sms")) 
    id city department sms category 
1 2 lhr revenue good   1 

タイミング

#[300000 rows x 5 columns] 
data = pd.concat([data]*100000).reset_index(drop=True) 

In [123]: %timeit (data.dropna(subset=['sms'])) 
100 loops, best of 3: 19.5 ms per loop 

In [124]: %timeit (data[data['sms'].notnull()]) 
100 loops, best of 3: 13.8 ms per loop 

In [125]: %timeit (data.query("sms == sms")) 
10 loops, best of 3: 23.6 ms per loop 
+1

うわー!ありがとう。それを感謝します。 –

+0

あなたは大歓迎です!喜んで助けることができます! – jezrael

+0

だから 'dropna'は最速ではありません... – IanS

1

あなたがこの方法dropnaを使用することができます。

data.dropna(axis=0, subset=('sms',)) 

は、パラメータの詳細についてはdocumentationを参照してください。

もちろん、これには複数の方法があり、パフォーマンスに若干の違いがあります。パフォーマンスが重要でない限り、最も表現力が高いのでdropna()の使用を推奨します。

import pandas as pd 
import numpy as np 

i = 10000000 

# generate dataframe with a few columns 
df = pd.DataFrame(dict(
    a_number=np.random.randint(0,1e6,size=i), 
    with_nans=np.random.choice([np.nan, 'good', 'bad', 'ok'], size=i), 
    letter=np.random.choice(list('abcdefghijklmnop'), size=i)) 
       ) 

# using notebook %%timeit 
a = df.dropna(subset=['with_nans']) 
#1.29 s ± 112 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

# using notebook %%timeit 
b = df[~df.with_nans.isnull()] 
#890 ms ± 59.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

# using notebook %%timeit 
c = df.query('with_nans == with_nans') 
#1.71 s ± 100 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 
+0

なぜタプルですか?これはあまり読めるものではありません... – IanS

関連する問題