2013-07-18 10 views
25

का उपयोग किए बिना पांडा डेटाफ्रेम में किसी चयनित सेल के लिए मूल्य बदलें, यह this question पर एक समान प्रश्न है, लेकिन एक महत्वपूर्ण अंतर के साथ: मैं उस डेटा का चयन कर रहा हूं जिसे मैं अपनी अनुक्रमणिका से नहीं बदलना चाहता हूं लेकिन कुछ मानदंडों से।इंडेक्स

मापदंड मैं एक ही पंक्ति लौट लागू होते हैं, मैं एक आसान तरीका में उस पंक्ति में एक निश्चित स्तंभ का मान सेट करने में सक्षम हो उम्मीद थी, लेकिन मेरा पहला प्रयास काम नहीं करता:

>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009], 
...     'flavour':['strawberry','strawberry','banana','banana', 
...     'strawberry','strawberry','banana','banana'], 
...     'day':['sat','sun','sat','sun','sat','sun','sat','sun'], 
...     'sales':[10,12,22,23,11,13,23,24]}) 

>>> d 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  12 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana  24 2009 

>>> d[d.sales==24] 
    day flavour sales year 
7 sun banana  24 2009 

>>> d[d.sales==24].sales = 100 
>>> d 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  12 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana  24 2009 

तो 200 9 की रविवार की बिक्री की बिक्री 100 की बजाय, कुछ भी नहीं होता! ऐसा करने का सबसे अच्छा तरीका क्या है? आदर्श रूप से समाधान को पंक्ति संख्या का उपयोग करना चाहिए, क्योंकि आप आमतौर पर पहले से ही नहीं जानते हैं!

अग्रिम में बहुत धन्यवाद, रोब

उत्तर

40

कई करने के लिए तरीके कि

In [7]: d.sales[d.sales==24] = 100 

In [8]: d 
Out[8]: 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  12 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana 100 2009 
In [26]: d.loc[d.sales == 12, 'sales'] = 99 

In [27]: d 
Out[27]: 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  99 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana 100 2009 
In [28]: d.sales = d.sales.replace(23, 24) 

In [29]: d 
Out[29]: 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  99 2008 
2 sat  banana  22 2008 
3 sun  banana  24 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  24 2009 
7 sun  banana 100 2009 
+1

हाँ! समाधान 1. काम किया। काउंटर-अंतर्ज्ञानी का क्रमबद्ध करें जो यह काम करता है: 'd.sales [d.sales == 24] = 100' लेकिन यह नहीं करता:' d [d.sales == 24] .sales = 100'। वे मेरे लिए समान होने के लिए (कार्यात्मक रूप से) दिखते हैं। ठीक है। धन्यवाद @ वाइटिंगकुओ। – LondonRob

+1

डी [d.sales == 24] एक नई वस्तु उत्पन्न करता है। – waitingkuo

+1

फिर से। @ प्रतीक्षाकुओ की टिप्पणी: क्या अपेक्षित व्यवहार, पांडा लोग हैं? निश्चित रूप से अंतर्ज्ञानी नहीं है कि 'd [d.sales == 24] 'मूल' डेटाफ्रेम 'की एक प्रति उत्पन्न करनी चाहिए। असल में, मैं कहूंगा कि प्रत्येक ऑब्जेक्ट मूल के संदर्भ में होना चाहिए (जिसमें एक पंक्ति का चयन करना शामिल है, जो सही ढंग से, एक पांडों 'श्रृंखला' में 'ध्वस्त' होता है) जब तक उपयोगकर्ता द्वारा स्पष्ट रूप से अनुरोध नहीं किया जाता है (किसी प्रकार की प्रतिलिपि के माध्यम से = TRUE')। विचार? – LondonRob

6

पांडा के पुराने संस्करण के बारे में निश्चित नहीं है, लेकिन 0.16 में एक विशेष सेल के मान को कई कॉलम मानों के आधार पर सेट किया जा सकता है।

@waitingkuo द्वारा प्रदान किए गए उत्तर को विस्तारित करना, एक ही ऑपरेशन एकाधिक कॉलम के मानों के आधार पर भी किया जा सकता है।

d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100