2013-07-04 6 views
84

mode.use_inf_as_null को रीसेट किए बिना पैंडस डेटाफ्रेम से नैन और inf/-inf मानों को ड्रॉप करने का सबसे तेज़/सरल तरीका क्या है?पांडा में डेटा फ्रेम से अनंत मूल्यों को छोड़ रहा है?

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

यह संभव है: मैं, dropna की subset और how तर्कों का उपयोग करने में सक्षम होना inf मान अनुपलब्ध, की तरह माना जाता है के साथ छोड़कर चाहते हैं? को अनुपलब्ध मानों की परिभाषा में शामिल करने के लिए dropna बताने का कोई तरीका है?

उत्तर

162

सबसे आसान तरीका NaN करने के लिए पहले replace infs होगा:

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 और उच्चतर समर्थन dict comprehensions: '{v: कॉलम में वी के लिए lst}' –

10

यहाँ एक और विधि .loc का उपयोग कर inf एक श्रृंखला पर नेन साथ बदलने के लिए है:

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

के साथ: मूल प्रश्न के जवाब में,

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

तो विकल्प संदर्भ, 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] 
संबंधित मुद्दे