2013-07-09 12 views
6

का उपयोग कर पांडा डेटाफ्रेम संपादित करें क्या पांडा में डेटाफ्रेम के सबसेट में मान असाइन करने का एक सामान्य, कुशल तरीका है? मेरे पास सैकड़ों पंक्तियां और कॉलम हैं जिन्हें मैं सीधे एक्सेस कर सकता हूं लेकिन मैंने यह पता लगाने में कामयाब नहीं किया है कि प्रत्येक पंक्ति, कॉल जोड़ी के माध्यम से बिना उनके मूल्यों को संपादित किया जाए। उदाहरण के लिए:इंडेक्स

In [1]: import pandas, numpy 

In [2]: array = numpy.arange(30).reshape(3,10) 

In [3]: df = pandas.DataFrame(array, index=list("ABC")) 

In [4]: df 
Out[4]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 1 2 3 4 5 6 7 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 21 22 23 24 25 26 27 28 29 

In [5]: rows = ['A','C'] 

In [6]: columns = [1,4,7] 

In [7]: df[columns].ix[rows] 
Out[7]: 
    1 4 7 
A 1 4 7 
C 21 24 27 

In [8]: df[columns].ix[rows] = 900 

In [9]: df 
Out[9]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 1 2 3 4 5 6 7 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 21 22 23 24 25 26 27 28 29 

मेरा मानना ​​है कि यहाँ क्या हो रहा है कि मैं एक दृश्य के बजाय एक प्रति हो रही है, जिसका अर्थ है मैं मूल DataFrame को असाइन नहीं कर सकते है। क्या यह मेरी समस्या है? उन पंक्तियों x कॉलम को संपादित करने का सबसे प्रभावी तरीका क्या है (अधिमानतः गतिशील, क्योंकि डेटाफ्रेम बहुत मेमोरी ले सकता है)?

इसके अलावा, यदि मैं उन मानों को सही ढंग से आकार वाले डेटाफ्रेम के साथ बदलना चाहता हूं तो क्या होगा?

उत्तर

10

एक काम अभिव्यक्ति में उपयोग loc (= मतलब है कि यह प्रासंगिक नहीं है कि क्या यह एक दृश्य या एक प्रति है!):

In [11]: df.loc[rows, columns] = 99 

In [12]: df 
Out[12]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 99 2 3 99 5 6 99 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 99 22 23 99 25 26 99 28 29 

आप 0.11 से पहले एक संस्करण का उपयोग कर रहे हैं तो आप .ix उपयोग कर सकते हैं ।

@Jeff के रूप में की टिप्पणियां:

यह एक काम अभिव्यक्ति ('advanced indexing with ix' section of the docs देखें) है और कुछ भी वापस नहीं करता है (हालांकि वहाँ काम भाव जो वापसी बातें करता है, उदा .at और .iat करते हैं)।

df.loc[rows,columns] एक दृश्य वापस कर सकता है, लेकिन आमतौर पर यह एक प्रति है। उलझन में, लेकिन दक्षता के लिए किया।

निष्कर्ष: किसी उपयोगix, loc, ilocस्थापित करने के लिए(ऊपर के रूप में), और प्रतियां बदलाव न करें।

दस्तावेज़ों के 'view versus copy' अनुभाग देखें।

+0

मुझे df.loc के लिए एक विशेषता त्रुटि मिलती है। मुझे लगता है कि यह पांडा 0.11 में नया है। क्या इससे पहले समकक्ष था, या यही कारण है कि मुझे हर दूसरे महीने पांडा को अपग्रेड करना होगा? – Noah

+0

इसके अलावा, क्या यह दस्तावेज़ों में कहीं भी वर्णन करता है कि यह एक दृश्य है, प्रतिलिपि नहीं? Http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy – Noah

+0

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