2013-09-05 13 views
10

मैं python2.7 और पांडा 0.11.0 का उपयोग कर रहा हूं।पांडा: कुछ numpy arrays के साथ एक कॉलम भरें

मैं DataFrame.apply (func) का उपयोग कर डेटाफ्रेम के कॉलम को भरने का प्रयास करता हूं। Func() फ़ंक्शन एक numpy सरणी (1x3) वापस करने के लिए माना जाता है।

import pandas as pd 
import numpy as np 

df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC')) 
print(df) 

       A   B   C 
    0 0.910142 0.788300 0.114164 
    1 -0.603282 -0.625895 2.843130 
    2 1.823752 -0.091736 -0.107781 
    3 0.447743 -0.163605 0.514052 

परीक्षण उद्देश्य के लिए इस्तेमाल समारोह:

def test(row): 
    # some complex calc here 
    # based on the values from different columns 
    return np.array((1,2,3)) 

df['D'] = df.apply(test, axis=1) 

[...] 
ValueError: Wrong number of items passed 1, indices imply 3 

हास्यास्पद है कि जब मैं खरोंच से dataframe बनाने के लिए, यह बहुत अच्छी तरह से काम करता है, और रिटर्न की उम्मीद है:

dic = {'A': {0: 0.9, 1: -0.6, 2: 1.8, 3: 0.4}, 
    'C': {0: 0.1, 1: 2.8, 2: -0.1, 3: 0.5}, 
    'B': {0: 0.7, 1: -0.6, 2: -0.1, 3: -0.1}, 
    'D': {0:np.array((1,2,3)), 
      1:np.array((1,2,3)), 
      2:np.array((1,2,3)), 
      3:np.array((1,2,3))}} 

df= pd.DataFrame(dic) 
print(df) 
     A B C   D 
    0 0.9 0.7 0.1 [1, 2, 3] 
    1 -0.6 -0.6 2.8 [1, 2, 3] 
    2 1.8 -0.1 -0.1 [1, 2, 3] 
    3 0.4 -0.1 0.5 [1, 2, 3] 

अग्रिम धन्यवाद

+3

आप 'list's /' 'DataFrame's या में tuple's का उपयोग कर से बचना चाहिए' सीरीज '। क्यों न केवल 'कॉलम' में 3 कॉलम हैं या आपके कॉलम के साथ एक अलग 'डेटाफ्रेम' क्यों नहीं है? –

+5

मुझे लगता है कि कभी-कभी वेक्टर फॉर्म कुछ मात्रा के लिए अधिक प्राकृतिक होता है, उदाहरण के लिए, निर्देशांक। 'df.endPoint-df.startPoint' स्पष्ट रूप से' np.c_ [df.endX-df.startX, df.endY-df.startY, df.endZ-df.startZ] 'के लिए अधिक बेहतर है। – herrlich10

उत्तर

11

यदि आप पारित किए गए फ़ंक्शन से कई मान वापस करने का प्रयास करते हैं o apply, और जिस डेटाफ्रेम को आप apply पर कॉल करते हैं, उस पर अक्ष के साथ आइटम की संख्या (इस मामले में कॉलम) आपके द्वारा लौटाए गए मानों की संख्या के रूप में होती है, पांडस मूल लेबल के समान लेबल के साथ वापसी मानों से डेटाफ्रेम बनाएंगे डेटा ढांचा। आप यह देख सकते अगर आप सिर्फ कार्य करें:

>>> def test(row): 
     return [1, 2, 3] 
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC')) 
>>> df.apply(test, axis=1) 
    A B C 
0 1 2 3 
1 1 2 3 
2 1 2 3 
3 1 2 3 

और वह है तुम क्यों त्रुटि मिलती है, जब से तुम DataFrame स्तंभ के लिए एक DataFrame नहीं सौंप सकते।

आप मूल्यों के किसी अन्य नंबर वापस करते हैं, यह सिर्फ एक श्रृंखला वस्तु वापस आ जाएगी, कि सौंपा जा सकता है:

>>> def test(row): 
     return [1, 2] 
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC')) 
>>> df.apply(test, axis=1) 
0 [1, 2] 
1 [1, 2] 
2 [1, 2] 
3 [1, 2] 
>>> df['D'] = df.apply(test, axis=1) 
>>> df 
      A   B   C  D 
0 0.333535 0.209745 -0.972413 [1, 2] 
1 0.469590 0.107491 -1.248670 [1, 2] 
2 0.234444 0.093290 -0.853348 [1, 2] 
3 1.021356 0.092704 -0.406727 [1, 2] 

मुझे यकीन है कि क्यों पांडा करता है नहीं कर रहा हूँ, और क्यों यह है कि यह केवल जब करता है वापसी मान एक list या एक ndarray है, क्योंकि यह ऐसा नहीं होगा यदि आप एक tuple वापसी:

>>> def test(row): 
     return (1, 2, 3) 
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC')) 
>>> df['D'] = df.apply(test, axis=1) 
>>> df 
      A   B   C   D 
0 0.121136 0.541198 -0.281972 (1, 2, 3) 
1 0.569091 0.944344 0.861057 (1, 2, 3) 
2 -1.742484 -0.077317 0.181656 (1, 2, 3) 
3 -1.541244 0.174428 0.66(1, 2, 3) 
+1

हाय विक्टर! उत्तर देने के लिए धन्यवाद। तो अगर मैं आपको सही ढंग से समझता हूं, तो एक numpy सरणी पास करने का कोई तरीका नहीं है? – Nic

+1

@Nic यदि numpy सरणी की लंबाई आपके कोड काम करने वाले स्तंभों की संख्या के समान नहीं है, लेकिन इसका उपयोग इस तरह से नहीं किया जाना है। फिलिप क्लाउड ने कहा कि आपको अपनी श्रृंखला में सूचियों या सरणी रखने से बचना चाहिए। आपको कई सीरीज (यानी, अपने डेटाफ्रेम में एकाधिक कॉलम) बनाना चाहिए। –

+0

धन्यवाद दोस्तों। मैं फिर आपकी सलाह का पालन करूंगा, और 3 कॉलम के लिए जाऊंगा। @ फिलिप: क्षमा करें मुझे पहली बार पढ़ने पर आपकी टिप्पणी याद आई। – Nic

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