2016-03-07 13 views
5

मैं निम्नलिखित पायथन कोड है, जो दो श्रृंखला (a और b) के साथ एक पांडा DataFrame बनाता भाग गया, और उसके बाद दो नए श्रृंखला (c और d) बनाने का प्रयास करता:नाम पर एक अवधि के साथ एक पांडा सीरीज बनाना

import pandas as pd 
df = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]}) 
df['c'] = df.a + df.b 
df.d = df.a + df.b 

मेरी समझ यह है कि यदि एक पांडस श्रृंखला डेटाफ्रेम का हिस्सा है, और श्रृंखला के नाम में कोई रिक्त स्थान नहीं है (और मौजूदा विशेषता या विधि से टकरा नहीं है), श्रृंखला को एक विशेषता के रूप में एक्सेस किया जा सकता है डेटाफ्रेम इस प्रकार, मुझे उम्मीद थी कि लाइन 3 काम करेगा (इस तरह से आप एक नई पांडस श्रृंखला बनाते हैं), और मुझे उम्मीद है कि लाइन 4 असफल हो जाएगी (चूंकि d विशेषता तब तक डेटाफ्रेम के लिए मौजूद नहीं है जब तक आप इसे निष्पादित नहीं कर लेते कोड की रेखा)।

मेरे आश्चर्य के लिए, लाइन 4 में कोई त्रुटि नहीं हुई। इसके बजाय, DataFrame अब तीन श्रृंखला में शामिल हैं:

>>> df 
    a b c 
0 1 4 5 
1 2 5 7 
2 3 6 9 

और वहाँ एक नई वस्तु, df.d है, जो एक पांडा श्रृंखला है:

>>> df.d 
0 5 
1 7 
2 9 
dtype: int64 

>>> type(df.d) 
pandas.core.series.Series 

मेरे सवालों का इस प्रकार हैं:

  • लाइन 4 के परिणामस्वरूप त्रुटि क्यों हुई?
  • df.d अब नियमित "सीरीज कार्यक्षमता के साथ" सामान्य "पांडस श्रृंखला है?
  • df.ddf डेटाफ्रेम पर किसी भी तरह से "कनेक्ट" है, या यह पूरी तरह से स्वतंत्र वस्तु है?

इस सवाल पूछने में मेरे प्रेरणा बस यह है कि मैं बेहतर पांडा को समझने के लिए चाहते हैं, और इसलिए नहीं कि लाइन के लिए एक विशेष उपयोग के मामले 4.

मेरे अजगर संस्करण 2.7.11 है वहाँ है, और मेरे पांडा संस्करण 0.17.1 है।

उत्तर

6

असाइनमेंट करते समय, आपको ब्रैकेट नोटेशन का उपयोग करने की आवश्यकता है, उदा। df['d'] = ...

d अब डेटाफ्रेम df की एक संपत्ति है। किसी ऑब्जेक्ट के साथ, आप उन्हें गुण असाइन कर सकते हैं। यही कारण है कि यह त्रुटि उत्पन्न नहीं किया। यह सिर्फ व्यवहार नहीं किया था के रूप में आप की उम्मीद ...

df.some_property = 'What?' 
>>> df.some_property 
'What?' 

यह शुरुआती पांडा के लिए गलतफहमी की एक आम क्षेत्र है। हमेशा असाइनमेंट के लिए ब्रैकेट नोटेशन का उपयोग करें। डाटाफ्रेम/श्रृंखला का संदर्भ देते समय डॉट नोटेशन सुविधा के लिए है। सुरक्षित होने के लिए, आप हमेशा ब्रैकेट नोटेशन का उपयोग कर सकते हैं।

और हां, df.d आपके उदाहरण के अनुसार एक सामान्य श्रृंखला है जो अब डेटाफ्रेम की एक अप्रत्याशित संपत्ति है। यह श्रृंखला आपके स्वयं के ऑब्जेक्ट है, जिसे आपने बनाया है जब आपने इसे df पर असाइन किया था।

1

@ अलेक्जेंडर का जवाब अच्छा है।लेकिन अभी स्पष्ट करने के लिए, यह एक पांडा के विशिष्टता नहीं है, बल्कि एक अजगर की विशिष्टता, एक संबंधित प्रश्न के लिए यहाँ देखें:

Why is adding attributes to an already instantiated object allowed in Python?

अपने आखिरी सवाल का सवाल है, सीरीज जुड़ा हुआ नहीं है (तुम क्या मतलब है पर निर्भर करता है यद्यपि जुड़े हुए हैं)। लेकिन, इस कल्पना:

df = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]}) 
df.d = df.a + df.b 
df.sort("a", ascending=False, inplace=True) 
df 
    a b 
2 3 6 
1 2 5 
0 1 4 

df.d 
0 5 
1 7 
2 9 
dtype: int64 

तो df.d हल नहीं किया गया है, df.a और df.b है, जबकि।

+0

यह अलेक्जेंडर के उत्तर में सहायक सहायक था, धन्यवाद! –

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