df =
Col1 Col2 Col3
1 nan 4
2 5 4
3 3 nan
鑑於數據幀df
南行,我想獲得一個新的數據幀df2
不包含nan
列Col2
。這是預期的結果: DF2 =過濾掉特定列
Col1 Col2 Col3
2 5 4
3 3 nan
我知道它是可以使用pandas.isnull
和dropna
,但如何對這些篩選應適用只指定特定的列?
df =
Col1 Col2 Col3
1 nan 4
2 5 4
3 3 nan
鑑於數據幀df
南行,我想獲得一個新的數據幀df2
不包含nan
列Col2
。這是預期的結果: DF2 =過濾掉特定列
Col1 Col2 Col3
2 5 4
3 3 nan
我知道它是可以使用pandas.isnull
和dropna
,但如何對這些篩選應適用只指定特定的列?
您可以使用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
使用dropna
:
df = df.dropna(subset=['Col2'])
print (df)
Col1 Col2 Col3
1 2 5.0 4.0
2 3 3.0 NaN
另一個解決方案 - boolean indexing
與notnull
:
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
使用numpy
的isnan
掩蓋和構建新的數據幀
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
能否請您添加計時此解決方案:'進口numexpr爲NE; col = df.Col2.values; %timeit df [ne.evaluate(「col == col」)]'? – MaxU