2013-09-05 4 views
10

저는 python2.7 및 pandas 0.11.0을 사용하고 있습니다.팬더 : 일부 numpy 배열로 열을 채우십시오

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

'시리즈 : 반환 값은 당신이 tuple을 반환하는 경우 그것을하지 않을 때문에, list 또는 ndarray입니다 '. 왜 단지'df'에 3 개의 컬럼을 가지고 있거나 당신의 컬럼과 별도의'DataFrame'을 가지지 않을까요? –

+5

때로는 벡터 양식이 일부 수량 (예 : 좌표)에 더 자연스러운 경우가 있습니다. 'df.endPoint-df.startPoint'는 분명히 np.c_ [df.endX-df.startX, df.endY-df.startY, df.endZ-df.startZ]'보다 바람직합니다. – herrlich10

답변

11

전달 된 함수에서 여러 값을 반환하려고하면 o apply이고 apply이라고하는 DataFrame은 반환 한 값의 수와 축 (이 경우 열)의 항목 수가 동일하므로 팬더는 원래 값과 동일한 레이블을 가진 반환 값에서 DataFrame을 만듭니다 DataFrame. 다음과 같이하면 알 수 있습니다.

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

나는 팬더는이 작업을 수행하는 이유는 확실하지 않다, 그것은 그 때만 않는 이유

>>> 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) 
당신은`DataFrame`s 또는`list`s /`tuple`s을 사용하지 않아야합니다
+1

안녕하세요 빅토르! 대답 덕분에. 그래서 내가 올바르게 당신을 이해한다면, 열등한 배열을 전달할 방법이없는 것입니까? – Nic

+1

@Nic numpy 배열의 길이가 코드가 작동하는 열의 수와 같지 않지만 그런 식으로 사용하려는 것이 아닙니다. 필립 클라우드 (Phillip Cloud)는 시리즈에 목록이나 배열을 배치하지 말아야한다고 말했습니다. 여러 Series (DataFrame에 여러 개의 열)를 만들어야합니다. –

+0

감사합니다. 나는 그 때 너의 충고를 따르고, 3 란을 위해 갈 것이다. @ 필립 : 죄송합니다. 처음 읽었을 때 귀하의 의견을 놓쳤습니다. – Nic

관련 문제