2016-09-29 16 views
18

के रूप में असाइन करते हैं मैंने हाल ही में पांडा "assign" method खोजा जो मुझे बहुत ही सुरुचिपूर्ण लगता है। मेरी समस्या यह है कि नए कॉलम का नाम कीवर्ड के रूप में असाइन किया गया है, इसलिए इसमें रिक्त स्थान या डैश नहीं हो सकते हैं।पांडा नए कॉलम नाम के साथ स्ट्रिंग

df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)}) 
df.assign(ln_A = lambda x: np.log(x.A)) 
     A   B  ln_A 
0 1 0.426905 0.000000 
1 2 -0.780949 0.693147 
2 3 -0.418711 1.098612 
3 4 -0.269708 1.386294 
4 5 -0.274002 1.609438 
5 6 -0.500792 1.791759 
6 7 1.649697 1.945910 
7 8 -1.495604 2.079442 
8 9 0.549296 2.197225 
9 10 -0.758542 2.302585 

लेकिन क्या अगर मैं नया स्तंभ "ln (ए)" उदाहरण के लिए नाम के लिए करना चाहते हैं? ईजी।

df.assign(ln(A) = lambda x: np.log(x.A)) 
df.assign("ln(A)" = lambda x: np.log(x.A)) 


File "<ipython-input-7-de0da86dce68>", line 1 
df.assign(ln(A) = lambda x: np.log(x.A)) 
SyntaxError: keyword can't be an expression 

मैं जानता हूँ कि मैं सही .assign कॉल के बाद स्तंभ का नाम बदलने सकता है, लेकिन मैं इस विधि और अपने वाक्यविन्यास के बारे में अधिक जानना चाहते हैं।

+0

अच्छी तरह से कोष्ठकों तुरंत विधि कॉल किसी तरह का है जो एक वर के लिए एक अवैध नाम है के रूप में इस का इलाज: //docs.python.org/3.2/reference/lexical_analysis.html#identifiers – EdChum

+0

उपर्युक्त उदाहरण से, मैं अभी भी डीएफ ['लॉग (ए)'] = df.sum (अक्ष = 1) कर सकता हूं, लेकिन मुझे समझ में आता है क्यों मुझे उपर्युक्त त्रुटि मिलती है (यह कुछ हद तक अपेक्षित था) – FLab

+0

लेकिन 'df ['log (ए)']' 'एक 'str' है जिसके लिए परिवर्तनीय नाम नियम लागू नहीं होते – EdChum

उत्तर

24

आप कीवर्ड तर्क तो की तरह, एक शब्दकोश के रूप में assign को पारित कर सकते हैं: https:

kwargs = {"ln(A)" : lambda x: np.log(x.A)} 
df.assign(**kwargs) 

    A   B  ln(A) 
0 1 0.500033 0.000000 
1 2 -0.392229 0.693147 
2 3 0.385512 1.098612 
3 4 -0.029816 1.386294 
4 5 -2.386748 1.609438 
5 6 -1.828487 1.791759 
6 7 0.096117 1.945910 
7 8 -2.867469 2.079442 
8 9 -0.731787 2.197225 
9 10 -0.686110 2.302585 
3

assign कुंजी शब्द तर्कों का एक समूह की अपेक्षा करता है। बदले में, कुंजी शब्दों के नाम से कॉलम असाइन करेंगे। यह आसान है, लेकिन आप एक अभिव्यक्ति को कुंजी शब्द के रूप में पास नहीं कर सकते हैं। यह बजाय inplace परिवर्तन

df.insert(2, 'ln(A)', np.log(df.A)) 
df 

enter image description here


उपयोग concat के लिए इस link

उपयोग insert साथ टिप्पणी में @EdChum द्वारा लिखा जाता है अगर आप inplace

नहीं करना चाहते
pd.concat([df, np.log(df.A).rename('log(A)')], axis=1) 

enter image description here

+0

आपके उत्तर के लिए धन्यवाद। व्यवहार में एक अंतर है क्योंकि डालने केवल इनस्थल – FLab

+0

@FLab मैंने पोस्ट अपडेट किया है – piRSquared

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