2013-07-04 33 views
84

從pandas DataFrame中刪除nan和inf/-inf值而不重置mode.use_inf_as_null的最快/最簡單的方法是什麼?我希望能夠使用的dropnasubsethow參數,除非考慮失蹤,像inf值:在熊貓的數據框中放入無限值?

df.dropna(subset=["col1", "col2"], how="all", with_inf=True) 

這可能嗎?有沒有辦法告訴dropna在缺失值的定義中包含inf

回答

162

最簡單的方式是首先replace的infs爲NaN:

df.replace([np.inf, -np.inf], np.nan) 

,然後使用dropna

df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all") 

例如:

In [11]: df = pd.DataFrame([1, 2, np.inf, -np.inf]) 

In [12]: df.replace([np.inf, -np.inf], np.nan) 
Out[12]: 
    0 
0 1 
1 2 
2 NaN 
3 NaN 

同樣的方法將爲一個系列工作。

5

上述解決方案將修改不在目標列中的inf。爲了彌補這方面,

lst = [np.inf, -np.inf] 
to_replace = dict((v, lst) for v in ['col1', 'col2']) 
df.replace(to_replace, np.nan) 
+2

蟒蛇2.7和更高的支持字典內涵:'{V:LST中的cols V}' –

10

下面是使用.loc另一種方法在系列與南更換INF:

s.loc[(~np.isfinite(s)) & s.notnull()] = np.nan 

因此,爲應對原題:

df = pd.DataFrame(np.ones((3, 3)), columns=list('ABC')) 

for i in range(3): 
    df.iat[i, i] = np.inf 

df 
      A   B   C 
0  inf 1.000000 1.000000 
1 1.000000  inf 1.000000 
2 1.000000 1.000000  inf 

df.sum() 
A inf 
B inf 
C inf 
dtype: float64 

df.apply(lambda s: s[np.isfinite(s)].dropna()).sum() 
A 2 
B 2 
C 2 
dtype: float64 
7

隨着選項的上下文,這可能沒有永久設置use_inf_as_null。例如:

with pd.option_context('mode.use_inf_as_null', True): 
    df = df.dropna(subset=['col1', 'col2'], how='all') 

當然也可以設置成與pd.set_option('use_inf_as_null', True)永久治療infNaN了。

+1

這是最可讀的答案,因此是最好的,即使它違反了信(但不是在靈)原來的問題。 – ijoseph

1

另一種解決方案是使用isin方法。用它來確定每個值是無限還是丟失,然後鏈接all方法以確定行中的所有值是無限還是缺失。

最後,使用該結果的否定,通過布爾索引來選擇沒有全部無限值或缺失值的行。

all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns') 
df[~all_inf_or_nan]