2017-05-06 117 views
4
df = 

Col1 Col2 Col3 
1 nan 4 
2 5 4 
3 3 nan 

鑑於數據幀df南行,我想獲得一個新的數據幀df2不包含nanCol2。這是預期的結果: DF2 =過濾掉特定列

Col1 Col2 Col3 
2 5 4 
3 3 nan 

我知道它是可以使用pandas.isnulldropna,但如何對這些篩選應適用只指定特定的列?

回答

7

您可以使用DataFrame.dropna()方法:

In [202]: df.dropna(subset=['Col2']) 
Out[202]: 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 

或(在這種情況下)以下慣用Series.notnull()

In [204]: df.loc[df.Col2.notnull()] 
Out[204]: 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 

或使用DataFrame.query()方法:

In [205]: df.query("Col2 == Col2") 
Out[205]: 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 

numexpr溶液:

In [241]: import numexpr as ne 

In [242]: col = df.Col2 

In [243]: df[ne.evaluate("col == col")] 
Out[243]: 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 
4

使用dropna

df = df.dropna(subset=['Col2']) 
print (df) 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 

另一個解決方案 - boolean indexingnotnull

df = df[df['Col2'].notnull()] 
print (df) 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 

什麼是一樣的:

df = df[~df['Col2'].isnull()] 
print (df) 
    Col1 Col2 Col3 
1  2 5.0 4.0 
2  3 3.0 NaN 
4

使用numpyisnan掩蓋和構建新的數據幀

m = ~np.isnan(df.Col2.values) 
pd.DataFrame(df.values[m], df.index[m], df.columns) 

    Col1 Col2 Col3 
1 2.0 5.0 4.0 
2 3.0 3.0 NaN 

定時
更大的數據

np.random.seed([3,1415]) 
df = pd.DataFrame(np.random.choice([np.nan, 1], size=(10000, 10))).add_prefix('Col') 

%%timeit 
m = ~np.isnan(df.Col2.values) 
pd.DataFrame(df.values[m], df.index[m], df.columns) 
1000 loops, best of 3: 326 µs per loop 

%timeit df.query("Col2 == Col2") 
1000 loops, best of 3: 1.48 ms per loop 

%timeit df.loc[df.Col2.notnull()] 
1000 loops, best of 3: 417 µs per loop 

%timeit df[~df['Col2'].isnull()] 
1000 loops, best of 3: 385 µs per loop 

%timeit df.dropna(subset=['Col2']) 
1000 loops, best of 3: 913 µs per loop 
+1

能否請您添加計時此解決方案:'進口numexpr爲NE; col = df.Col2.values; %timeit df [ne.evaluate(「col == col」)]'? – MaxU