2013-06-12 17 views
19

के लिए शून्य या मान का अधिकतम रिटर्न अधिकतम मैं शून्य के साथ एक पांडा डेटाफ्रेम कॉलम में ऋणात्मक मानों को प्रतिस्थापित करना चाहता हूं।एक पांडा डेटाफ्रेम कॉलम

क्या इस अभिव्यक्ति को बनाने के लिए कोई और संक्षिप्त तरीका है?

df['value'][df['value'] < 0] = 0 
+1

ऐसा लगता है कि आप इसे 'numpy' में कैसे करेंगे ... मुझे संदेह है कि इसे 2 कथनों में तोड़ने के अलावा एक और संक्षिप्त तरीका है। – mgilson

+0

शायद कुछ 'df [' value '] = max ((df [' value '], 0) जैसे) – John

उत्तर

13

यहाँ, यह कर के विहित तरीका है, जबकि जरूरी नहीं कि अधिक संक्षिप्त, अधिक लचीला है (कि आप मनमाने ढंग से स्तंभों को यह आवेदन कर सकते हैं)

In [39]: df = DataFrame(randn(5,1),columns=['value']) 

In [40]: df 
Out[40]: 
     value 
0 0.092232 
1 -0.472784 
2 -1.857964 
3 -0.014385 
4 0.301531 

In [41]: df.loc[df['value']<0,'value'] = 0 

In [42]: df 
Out[42]: 
     value 
0 0.092232 
1 0.000000 
2 0.000000 
3 0.000000 
4 0.301531 
+0

अधिक लचीला (और कम अस्पष्ट)। –

+0

यह नकली कोड में एक आम मुहावरे है। +1 – heltonbiker

+0

हालांकि कुछ मामलों में, np.clip या np.max समाधान अधिक आसानी से पढ़े जाते हैं, मुझे लगता है कि यह मेरे मूल प्रश्न का सबसे सटीक उत्तर है। – bjornarneson

13

आप clip method इस्तेमाल कर सकते हैं:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'value': np.arange(-5,5)}) 
df['value'] = df['value'].clip(0, None) 
print(df) 

पैदावार

value 
0  0 
1  0 
2  0 
3  0 
4  0 
5  0 
6  1 
7  2 
8  3 
9  4 
+2

एक तरफ नोट पर, आपको 'np की आवश्यकता नहीं है दूसरे तर्क के रूप में .inf'। यह किसी भी मामले में डिफ़ॉल्ट नहीं है, जो इस मामले में बराबर है। यदि आप दूसरे तर्क को छोड़ने के साथ पठनीयता के बारे में चिंतित हैं, तो आप इसके बजाय 'df.value.clip_lower (0)' का उपयोग कर सकते हैं। –

+0

@ जोकिंगटन: ओह, धन्यवाद! – unutbu

+0

इसके लायक होने के लिए, मैंने 'pandas.DataFrame.clip 'को' numpy' की तरह व्यवहार किया। मुझे केवल एहसास हुआ कि लगभग 5 मिनट पहले ऐसा नहीं हुआ (और आपको दूसरी तर्क की आवश्यकता नहीं थी)! :) –

10

numpy.maximum() का उपयोग करने की एक और संभावना है। यह मेरी राय में पढ़ने के लिए और अधिक सीधे आगे है।

import pandas as pd 
import numpy as np 
df['value'] = np.maximum(df['value'], 0) 

और यह 2-3x तेज भी है।

In [21]: df = pd.DataFrame({'value': np.arange(-1000000,1000000)}) 
In [22]: %timeit df.loc[df['value']<0,'value'] = 0 
10 loops, best of 3: 27.3 ms per loop 

In [23]: df = pd.DataFrame({'value': np.arange(-1000000,1000000)}) 
In [24]: %timeit df['value'] = np.maximum(df['value'], 0) 
100 loops, best of 3: 9.42 ms per loop 
+0

मुझे लगता है कि यह अच्छा है, केवल एक बुरी चीज यह है कि 'np.max! = Np.maximum' जो इस बुरे को याद करता है – maxymoo

0

चलो केवल शून्य से अधिक मान लेते हैं, जो नाएन के रूप में नकारात्मक हैं (श्रृंखला के साथ फ्रेम के साथ काम करता है), फिर अपशब्द।

df[df > 0].fillna(0) 
संबंधित मुद्दे