2014-09-28 8 views
8

में प्रत्येक तत्व से पंक्ति का अर्थ घटाएं मेरे पास रासायनिक तत्व प्रकार और विभिन्न नमूनों का प्रतिनिधित्व करने वाले स्तंभों द्वारा अनुक्रमित पंक्तियों के साथ डेटाफ्रेम है। मान प्रत्येक नमूने में पंक्ति तत्व की उपस्थिति की डिग्री का प्रतिनिधित्व करने वाले फ्लोट होते हैं।पांडस: पंक्ति

मैं प्रत्येक पंक्ति के माध्य की गणना करना चाहता हूं और डेटा को सामान्य करने के लिए उस विशिष्ट पंक्ति में प्रत्येक मान से घटा देना चाहता हूं, और उस डेटासेट का एक नया डेटाफ्रेम बनाना चाहता हूं।

मैंने माध्य (1) का उपयोग करने की कोशिश की, जो मुझे प्रत्येक रासायनिक तत्व के लिए एक श्रृंखला वस्तु प्रदान करता है, जो अच्छा है, लेकिन फिर मैंने घटाया, जो काम नहीं करता था।

उत्तर

21

आप DataFrame के sub विधि का उपयोग करें और यह दर्शाते हैं कि घटाव होना चाहिए सकता है पंक्ति-वार (axis=0) के रूप में डिफ़ॉल्ट स्तंभ-वार व्यवहार करने का विरोध किया:

>>> df = pd.DataFrame({'a': [1.5, 2.5], 'b': [0.25, 2.75], 'c': [1.25, 0.75]}) 
>>> df 
    a  b  c 
0 1.5 0.25 1.25 
1 2.5 2.75 0.75 
:

df.sub(df.mean(axis=1), axis=0) 

यहाँ एक उदाहरण है

प्रत्येक पंक्ति का अर्थ गणना करने के लिए सीधा है:

>>> df.mean(axis=1) 
0 1 
1 2 
dtype: float64 

DataFrame की पंक्तियों को डी-मतलब के लिए, बस df इस तरह से पंक्तियों की मतलब मूल्यों घटाना:

>>> df.sub(df.mean(axis=1), axis=0) 
    a  b  c 
0 0.5 -0.75 0.25 
1 0.5 0.75 -1.25 
+1

मुझे लगता है कि धुरी वास्तव में भ्रमित है। उदाहरण के लिए, 'अक्ष = 1' का अर्थ पंक्ति-वार औसत प्राप्त करना है, हालांकि,' अक्ष = 1' का अर्थ कॉलम के अनुसार घटाना है, क्या मैं इस परंपरा को गलत समझ रहा हूं कि अक्ष का उपयोग कैसे करें? –

+0

@ बीएमआर।मैं मानता हूं कि यह बहुत भ्रमित हो सकता है (मैं नियमित रूप से अटक जाता हूं और न्यूमपी/पांडस से निपटने के दौरान अक्ष संख्याओं के साथ खेलना पड़ता हूं)। असल में, 'अक्ष = 1' का अर्थ केवल "डेटाफ्रेम पर" है। इसका मतलब पंक्ति में प्रविष्टियां हो सकती हैं (जैसा कि 'df.mean (axis = 1) ') में है, या, चूंकि कॉलम के नाम भी डेटाफ्रेम पर जाते हैं, इसलिए' अक्ष = 1' का उपयोग तब किया जाता है जब कॉलम नामों को संदर्भित करने की आवश्यकता होती है सेवा मेरे। मुझे लगता है कि स्टैक ओवरफ्लो पर इस विषय के बारे में कुछ प्रश्न हैं, जिनमें से एक मैंने जवाब दिया [http://stackoverflow.com/a/25774395/3923281)। –

6

इसके अतिरिक्त @ ajcr उत्तम जवाब देने के लिए, आप उलटफेर आप अपने डेटा को संग्रह करने पर विचार करना चाहते हो सकता है।

इस समय आप अलग-अलग कॉलम में विभिन्न नमूनों के साथ ऐसा कर रहे हैं, जिस तरह से आप स्प्रेडशीट का उपयोग कर रहे थे, लेकिन यह आपके डेटा का प्रतिनिधित्व करने का सबसे सहायक तरीका नहीं हो सकता है।

आम तौर पर, प्रत्येक कॉलम के बारे में जानकारी का एक अद्वितीय टुकड़ा दर्शाता है जो एक वास्तविक वास्तविक इकाई है। इस प्रकार का डेटा का विशिष्ट उदाहरण एक व्यक्ति है:

id name hair_colour Age 
1 Bob Brown  25 

वास्तव में, अपने विभिन्न नमूनों विभिन्न वास्तविक दुनिया संस्थाओं हैं।

इसलिए मैं सूचना के प्रत्येक टुकड़े का वर्णन करने के लिए दो-स्तर की अनुक्रमणिका रखने का सुझाव दूंगा। यह आपके डेटा को उस तरीके से जोड़ता है जिस तरह से आप अधिक सुविधाजनक चाहते हैं।

इस प्रकार

:

>>> df = pd.DataFrame([['Sn',1,2,3],['Pb',2,4,6]], 
         columns=['element', 'A', 'B', 'C']).set_index('element') 
>>> df.columns.name = 'sample' 
>>> df # This is how your DataFrame looks at the moment 
sample A B C 
element   
Sn  1 2 3 
Pb  2 4 6 
>>> # Now make those columns into a second level of index 
>>> df = df.stack() 
>>> df 
element sample 
Sn  A   1 
     B   2 
     C   3 
Pb  A   2 
     B   4 
     C   6 

अब हम अपने निपटान में groupby के सभी स्वादिष्ट कार्यक्षमता है:

>>> demean = lambda x: x - x.mean() 
>>> df.groupby(level='element').transform(demean) 
element sample 
Sn  A  -1 
     B   0 
     C   1 
Pb  A  -2 
     B   0 
     C   2 

आप इस तरह से अपने डेटा जब देखते हैं, तो आपको लगता है कि कई, कई मिल जाएगा मल्टी-कॉलम DataFrames होने के लिए उपयोग किए जाने वाले मामलों का उपयोग वास्तव में मल्टीइन्डेक्स Series है, और आपके पास डेटा का प्रतिनिधित्व और रूपांतरण कैसे किया जाता है, इस पर अधिक शक्ति है।