2016-02-28 8 views
6

द्वारा सामान्यीकृत करें मेरे पास स्पेक्ट्रल डेटा और मेटाडेटा युक्त एक पांडा डेटाफ्रेम है। कॉलम को मल्टीइंडेक्स के साथ लेबल किया गया है ताकि df['wvl'] स्पेक्ट्रा और df['meta'] मेटाडेटा देता है। df['wvl'] के भीतर कॉलम लेबल स्पेक्ट्रोमीटर चैनलों के तरंगदैर्ध्य मान हैं।पांडा डेटा फ्रेम की पंक्तियों को उनके रकम

मैं जो करना चाहता हूं वह उस पंक्ति के योग से df['wvl'] की प्रत्येक पंक्ति को सामान्यीकृत करना है ताकि पंक्ति में मान जोड़ने से कुल 1.0 हो।

यहाँ dataframe में से एक पंक्ति की तरह दिखता है:

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

लेकिन जब मैं की तरह कुछ कार्य करें:

df['wvl'].iloc[0]=df['wvl'].iloc[0]/df['wvl'].iloc[0].sum() 

कुछ नहीं होता!

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

अगर मैं एक अस्थायी चर बनाने पंक्ति धारण करने के लिए, मैं सिर्फ ठीक सामान्यीकरण कर सकते हैं::

temp=df['wvl'].iloc[0] 

temp=temp/temp.sum() 

temp 
246.050003 0.000027 
246.102005 0.000022 
246.156006 0.000021 
       ... 
848.697205 0.000026 
848.896423 0.000027 
849.095703 0.000026 
Name: 0, dtype: float64 

लेकिन अगर मैं साथ dataframe पंक्ति को बदलने के लिए कोशिश मैं ठीक उसी मूल्यों को प्राप्त सामान्यीकृत अस्थायी चर, कुछ नहीं होता:

df['wvl'].iloc[0]=temp 

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
       ...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

मैं स्पष्ट रूप से यहाँ कुछ याद कर रहा हूँ, लेकिन मैं समझ नहीं क्या और यह मेरे पागल गाड़ी चला रहा है। मदद? अग्रिम में धन्यवाद!

+0

[पंक्ति से एक पांडा DataFrame सामान्य] (https://stackoverflow.com/questions/18594469/normalizing-a-pandas-dataframe-by-row) की संभावित डुप्लिकेट –

उत्तर

10

आप प्रत्येक पंक्ति ऊपर

df.div(df.sum(axis=1), axis=0) 

df.sum(axis=1) रकम का उपयोग कर सकते हैं; df.div(..., axis=0) फिर विभाजित करता है।

उदाहरण:

import pandas as pd 

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
>>> df.div(df.sum(axis=1), axis=0) 
    a b 
0 0.250000 0.750000 
1 0.333333 0.666667 
+0

वाह , उसने जादू की तरह काम किया! धन्यवाद! क्या आप मेरी समझ में मदद कर सकते हैं कि मैं क्यों कर रहा था काम नहीं कर रहा था? – rba

+0

@ eft773 तो मैंने थोड़ा सा झुकाया, और ऐसा लगता है कि 'iloc' एक प्रतिलिपि वापस कर रहा है, और इसलिए, इसे असाइनमेंट कुछ भी नहीं बदलता है। क्या यह आपके प्रश्न को संबोधित करता है? –

+0

आह, मैं देखता हूं। मुझे लगता है कि समझ में आता है। तो, अनिवार्य रूप से 'डीएफ [' wvl ']। Iloc [0]' वास्तव में डीएफ ['wvl'] का हिस्सा नहीं है, इसलिए इसे संपादित करने से मूल के लिए कुछ भी नहीं होता है। धन्यवाद! – rba

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