2013-09-05 16 views
10

Python2.7 ve pandalar 0.11.0 kullanıyorum.pandas: Bazı numpy dizileri olan bir sütunu doldurun

DataFrame.apply (func) kullanarak bir veri çerçevesinin sütununu doldurmaya çalışıyorum. Func() işlevinin numpy dizisini (1x3) döndürmesi beklenir.

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 

test amaçlıdır kullanılan fonksiyon:

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 

komik sıfırdan dataframe oluşturduğunuzda beklendiği gibi oldukça iyi çalışıyor, ve iadeler şudur:

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] 

Şimdiden teşekkürler.

+3

' Seri: dönüş değeri bir tuple dönerseniz bunu yapmayacağım çünkü bir list veya ndarray olduğunu '. Neden sütunlarınızda "df" veya ayrı bir "DataFrame" içinde 3 sütun var? –

+5

Sanırım bazen vektör formu bir miktar için daha doğaldır, örneğin koordinatlar. df.endPoint-df.startPoint' açık bir şekilde daha np.c_ [df.endX-df.startX, df.endY-df.startY, df.endZ-df.startZ] 'ye tercih edilir. – herrlich10

cevap

11

T geçirilen işlevden birden çok değer döndürmeye çalışırsanız o apply ve apply üzerinde aradığınız DataFrame, döndürdüğünüz değerlerin sayısı olarak eksen boyunca aynı sayıda öğeye (bu durumda sütunlara) sahiptir, Pandalar, orijinalle aynı etiketlere sahip dönüş değerlerinden bir DataFrame oluşturur Veri çerçevesi. Sadece yaparsanız bunu görebilirsiniz:

>>> 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 

Ve hata alıyorum neden DataFrame sütuna bir DataFrame atanamıyor çünkü olmasıdır. Eğer değerler başka bir numara dönerseniz

, sadece bir dizi nesne dönecek, o atanabilir:

>>> 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] 

Ben Pandalar bunu neden yaptığını emin değilim ve bunu yalnızca neden yaptığını

>>> 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) 
sen `DataFrame`s veya` list`s/`tuple`s kullanmaktan kaçınmalısınız
+1

Merhaba Viktor! Cevabınız için teşekkürler. Yani eğer seni doğru anlarsam, numpy dizisini geçmenin bir yolu yok mu? – Nic

+1

@Nic Sayısal dizinin uzunluğu, kodunuzun çalışacağı sütun sayısıyla aynı değilse, ancak böyle bir şekilde kullanılması amaçlanmamıştır. Phillip Cloud, Dizilerinize listeleri veya dizileri yerleştirmekten kaçınmanız gerektiğini söyledi. Birden çok Seri (yani DataFrame'inizde birden çok sütun) oluşturmanız gerekir. –

+0

Teşekkürler çocuklar. Daha sonra tavsiyenizi takip edip 3 sütun için gideceğim. @Phillip: Üzgünüz, ilk okumada yorumunuzu kaçırdım. – Nic

İlgili konular