2014-05-06 2 views
6

पांडस डेटाफ्रेम से डेटा का चयन करते समय, कभी-कभी एक दृश्य वापस आ जाता है और कभी-कभी एक प्रति वापस लौटा दी जाती है। हालांकि इसके पीछे कोई तर्क है, क्या पांडों को पर मजबूर करने का कोई तरीका है स्पष्ट रूप से कोई दृश्य या प्रतिलिपि वापस करें?पांडा में प्रतिलिपि के बजाय "दृश्य" की सेना वापसी?

+0

आप एक दृश्य और एक प्रति के बीच अंतर का एक नमूना दे सकते हैं? – cwharland

+0

नियमों के लिए यहां देखें: http://stackoverflow.com/questions/23296282/what-rules-does-pandas-use-to-generate-a-view-vs-a-copy –

+0

@cwharland, मेरी समझ संशोधनों में है एक दृश्य में प्राथमिक डेटाफ्रेम (इसलिए एक संदर्भ) भी संशोधित करता है, और एक प्रति है ... एक प्रति। – calben

उत्तर

4

आपके प्रश्न के दो भाग हैं: (1) एक दृश्य कैसे बनाएं (इस उत्तर के नीचे देखें), और (2) एक प्रतिलिपि कैसे बनाएं।

मैं कुछ उदाहरण डेटा के साथ प्रदर्शित होगी:

import pandas as pd 

df = pd.DataFrame([[1,2,3],[4,5,6],[None,10,20],[7,8,9]], columns=['x','y','z']) 

# which looks like this: 
    x y z 
0 1 2 3 
1 4 5 6 
2 NaN 10 20 
3 7 8 9 

कैसे एक प्रतिलिपि बनाने के लिए: एक विकल्प स्पष्ट रूप से जो कुछ भी आपरेशन आप प्रदर्शन के बाद अपने DataFrame कॉपी करने के लिए है। उदाहरण के लिए, मान लीजिए कि हम पंक्तियों NaN की जरूरत नहीं है का चयन कर रहे:

df2 = df[~df['x'].isnull()] 
df2 = df2.copy() 

फिर, अगर आप आप पाएंगे कि संशोधनों मूल डेटा (DF) वापस करने के लिए प्रचार नहीं करते df2 में मानों को संशोधित, और कहा कि पांडा ने चेतावनी दी यह नहीं है कि

df2['x'] *= 100 

# original data unchanged 
print(df) 

    x y z 
0 1 2 3 
1 4 5 6 
2 NaN 10 20 
3 7 8 9 

# modified data 
print(df2) 

    x y z 
0 100 2 3 
1 400 5 6 
3 700 8 9 

नोट "एक मूल्य एक DataFrame से एक टुकड़ा की एक प्रति पर सेट किया जा करने की कोशिश कर रहा है": यदि आप एक प्रदर्शन स्पष्ट रूप से एक प्रतिलिपि बनाकर मारा लग सकता है।

चेतावनी कैसे अनदेखी करने के लिए: वैकल्पिक रूप से, कुछ मामलों में आप परवाह नहीं हो सकता है एक दृश्य या कॉपी लौटाया जाए या, क्योंकि आपका इरादा स्थायी रूप से डेटा को संशोधित करने और मूल डेटा के लिए वापस जाना कभी नहीं है। इस मामले में, आप चेतावनी को दबा सकते हैं और अपने रास्ते पर आसानी से जा सकते हैं (बस यह न भूलें कि आपने इसे बंद कर दिया है, और मूल डेटा आपके कोड द्वारा संशोधित या संशोधित नहीं किया जा सकता है, क्योंकि df2 हो सकता है या नहीं एक प्रति हो): पांडा परोक्ष विचारों जहां भी और कर देगा जब भी संभव:

pd.options.mode.chained_assignment = None # default='warn' 

अधिक जानकारी के लिए कैसे एक दृश्य बनाने के लिए How to deal with SettingWithCopyWarning in Pandas?

पर जवाब देखते हैं। इसकी कुंजी df.loc[row_indexer,col_indexer] विधि का उपयोग करना है। उदाहरण के लिए, केवल पंक्तियों जहां स्तंभ x रिक्त नहीं है के लिए 100 से स्तंभ y के मूल्यों गुणा करने के लिए, हम लिख होगा:

mask = ~df['x'].isnull() 
df.loc[mask, 'y'] *= 100 

# original data has changed 
print(df) 

    x y z 
0 1.0 200 3 
1 4.0 500 6 
2 NaN 10 20 
3 7.0 800 9 
+1

jeffgoldblumthereitis.gif :-D – calben

+0

यह उत्तर, निराशाजनक रूप से, बाकी इंटरनेट की तरह पूछे गए प्रश्न के विपरीत जवाब देता है। -1 –

+1

सवाल यह था कि "पांडों को स्पष्ट रूप से एक दृश्य या प्रतिलिपि वापस करने के लिए मजबूर करने का कोई तरीका है?" जिस पर मैंने जवाब दिया कि स्पष्ट रूप से एक प्रतिलिपि कैसे बनाएं। मुझे लगता है कि निराशाजनक हिस्सा यह है कि यदि आप स्पष्ट रूप से इसके बजाय एक दृश्य चाहते थे? यह भी ध्यान रखें कि प्रश्न शीर्षक विवरण में प्रश्न से अलग है ... जो मदद नहीं करता है। – MD004

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