2017-01-20 2 views
6

मैं एक dataframe है:पांडा dataframe में स्तंभ quantile साथ बाहरी कारकों के कारण बदलें

df = pd.DataFrame(np.random.randint(0,100,size=(5, 2)), columns=list('AB')) 
    A B 
0 92 65 
1 61 97 
2 17 39 
3 70 47 
4 56 6 

यहाँ 5% quantiles हैं:

down_quantiles = df.quantile(0.05) 
A 24.8 
B 12.6 

और यहाँ मानों quantiles की तुलना में कम कर रहे हैं के लिए मुखौटा है:

outliers_low = (df < down_quantiles) 
     A  B 
0 False False 
1 False False 
2 True False 
3 False False 
4 False True 

मैं अपने कॉलम क्वांटाइल के लिए मात्रा से कम df में मान सेट करना चाहता हूं । मैं इसे इस तरह कर सकता हूं:

df[outliers_low] = np.nan 
df.fillna(down_quantiles, inplace=True) 

    A B 
0 92.0 65.0 
1 61.0 97.0 
2 24.8 39.0 
3 70.0 47.0 
4 56.0 12.6 

लेकिन निश्चित रूप से एक और शानदार तरीका होना चाहिए। मैं fillna के बिना यह कैसे कर सकता हूं? धन्यवाद।

+0

आप एक लाइनर मन करते हैं? – EdChum

+0

मैंने सोचा कि ऐसा करने के लिए और अधिक देशी पांडा रास्ता होना चाहिए। और निकिल मावेली का जवाब स्पष्ट रूप से दिखाता है। – shda

+0

हां मैं 'मास्क' के बारे में भूल गया, मैंने निकिल के जवाब को तब्दील कर दिया है – EdChum

उत्तर

8

आप DF.mask() विधि का उपयोग कर सकते हैं। जहां भी True उदाहरण की उपस्थिति है, अन्य श्रृंखलाओं के मान axis=1 प्रदान करके मेल खाने वाले कॉलम नामों के अनुसार गठित हो गए हैं।

df.mask(outliers_low, down_quantiles, axis=1) 

enter image description here


एक और प्रकार टिल्ड (~) प्रतीक का उपयोग अपने बूलियन मुखौटा inverting के बाद DF.where() विधि का उपयोग करना होगा। `Df [~ outliers_low] .fillna (down_quantiles, inplace = सच)`:

df.where(~outliers_low, down_quantiles, axis=1) 

enter image description here

संबंधित मुद्दे