2014-10-29 5 views
5

पर आधारित डेटाफ्रेम कॉलम में मूल्यों को बदलें मेरे पास एक आसान काम है। 2 कॉलम के साथ डेटाफ्रेम: ए और बी। यदि बी में मान ए में मानों से बड़े होते हैं - उन मानों को ए के मानों से प्रतिस्थापित करें। मैं df.B[df.B > df.A] = df.A कर ऐसा करने के लिए ऐसा करता था, हालांकि हालिया अपग्रेड ने पांडेस को SettingWithCopyWarning देना शुरू किया जब इस श्रृंखला का सामना करना पड़ा असाइनमेंट। आधिकारिक दस्तावेज .loc का उपयोग करने की सिफारिश करता है।स्थिति

ठीक है, मैंने कहा, और df.loc[df.B > df.A, 'B'] = df.A के माध्यम से किया और यह सब ठीक काम करता है, जब तक कॉलम बी में NaN के सभी मान नहीं हैं। फिर कुछ अजीब होता है:

In [1]: df = pd.DataFrame({'A': [1, 2, 3],'B': [np.NaN, np.NaN, np.NaN]}) 

In [2]: df 
Out[2]: 
    A B 
0 1 NaN 
1 2 NaN 
2 3 NaN 

In [3]: df.loc[df.B > df.A, 'B'] = df.A 

In [4]: df 
Out[4]: 
    A     B 
0 1 -9223372036854775808 
1 2 -9223372036854775808 
2 3 -9223372036854775808 

अब, अगर भी बी के तत्वों में से एक शर्त (ए से भी बड़ा) को संतुष्ट करता है, तो यह सब ठीक काम करता है:

In [1]: df = pd.DataFrame({'A': [1, 2, 3],'B': [np.NaN, 4, np.NaN]}) 

In [2]: df 
Out[2]: 
    A B 
0 1 NaN 
1 2 4 
2 3 NaN 

In [3]: df.loc[df.B > df.A, 'B'] = df.A 

In [4]: df 
Out[4]: 
    A B 
0 1 NaN 
1 2 2 
2 3 NaN 

लेकिन अगर बी एस तत्वों में से कोई भी संतुष्ट, उसके बाद सभी NaN रों प्राप्त -9223372036854775808 साथ बदल देता है:

In [1]: df = pd.DataFrame({'A':[1,2,3],'B':[np.NaN,1,np.NaN]}) 

In [2]: df 
Out[2]: 
    A B 
0 1 NaN 
1 2 1 
2 3 NaN 

In [3]: df.loc[df.B > df.A, 'B'] = df.A 

In [4]: df 
Out[4]: 
    A     B 
0 1 -9223372036854775808 
1 2     1 
2 3 -9223372036854775808 

यह एक बग या एक विशेषता है? मुझे यह प्रतिस्थापन कैसे करना चाहिए?

धन्यवाद!

+1

निश्चित रूप से मेरे लिए एक बग की तरह दिखता है, शायद [https://github.com/pydata/pandas/issues ](https://github.com/pydata/pandas/issues पर रिपोर्ट करने का एक अच्छा विचार है) – Marius

उत्तर

7

यह एक buggie है, निश्चित here है।

चूंकि पांडा मूल रूप से किसी भी अभिव्यक्ति के दाहिने हाथ पर सेट करने की अनुमति देता है, तो शायद 10+ मामले हैं जिन्हें असंबद्ध करने की आवश्यकता है। आप यह अनुमान लगा करने के लिए:

df.loc[lhs, column] = rhs 

जहां आरएचएस हो सकता है: list,array,scalar, और एलएचएस हो सकता है: slice,tuple,scalar,array

और मामलों के एक छोटे सबसेट जहां स्तंभ के परिणामस्वरूप dtype अनुसार अनुमान लगाया/निर्धारित करने की आवश्यकता rhs के लिए। (यह थोड़ा जटिल है)। उदाहरण के लिए कहें कि आप एलएचएस पर सभी तत्वों को सेट नहीं करते हैं और यह पूर्णांक था, तो आपको फ्लोट करने के लिए मजबूर होना होगा। लेकिन अगर आपने सभी तत्वों को सेट किया है और rhs एक पूर्णांक था तो इसे पूर्णांक पर वापस ले जाने की आवश्यकता है।

इस इस विशेष मामले में, एलएचएस एक सरणी है, इसलिए हम सामान्य रूप से आरएचएस के प्रकार के एलएचएस मजबूर करने की कोशिश करेंगे, लेकिन इस मामले घिनौना हम एक असुरक्षित रूपांतरण है (पूर्णांक -> नाव)

यह कहना पर्याप्त है कि यह एक लापता किनारा मामला था।

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