2014-07-12 2 views
0

은의이 최소한의 예를 살펴 보자 :예기치 않은 결과

In [208]: 
L={'A':[[1,2]], 
    'B':[[3,4], [5,6]]} 
df=pd.DataFrame.from_dict(dict(L), orient="index").stack().reset_index(level=0) 
df['val']=None 
print 'before apply. \n\n', df 
f=lambda x: [x[0], x[1][0], x[1][1]] 
print '\nafter apply. \n\n', df.apply(f, axis=1) 

before apply. 

    level_0  0 val 
0  A [1, 2] None 
0  B [3, 4] None 
1  B [5, 6] None 

after apply. 

    level_0 0 val 
0 [1, 2] 1 2 
0 [3, 4] 3 4 
1 [5, 6] 5 6 

이상한를! lambda 기능은 각 행에 대해 list을 반환하도록되어 : 나는 약 apply() 오해 뭔가

level_0 0 val 
0  A 1 2 
0  B 3 4 
1  B 5 6 

있습니까 : 1 행에 대해, 결과는 ['A', 1, 2]은, 그러므로, apply()의 예상 행동해야 할 것인가?

답변

2

당신이 (정수) 이름 0와 열 때문에 x[0] 의미를 가지고 있기 때문에,하지 열 번호 0부터 "라는 열 0에서 얻을"그러나 1 그렇게 x[1]는 "열 번호 1에서 얻을"의미라는 이름의 열이 없습니다.

시도가 x['level_0']

f=lambda x: [x['level_0'], x[1][0], x[1][1]] 

를 사용하거나 문자열로 COLUMNA 0의 이름을 변경 "0"

1

인라인 코멘트 : 이야기의

>>> ts = df.iloc[0,] # take the first row as an example 
>>> ts 
level_0   A 
0   [1, 2] 
val   None 
Name: 0, dtype: object 
>>> ts[0] # `0` is in the index, so it resolves to item with `index` 0 
[1, 2] 
>>> ts[1] # one is not in the index, so it resolves to ts.iloc[1] 
[1, 2] 
>>> ts[1][0] # (ts.iloc[1])[0] 
1 
>>> ts[1][1] # (ts.iloc[1])[1] 
2 

도덕적는 다음과 같이 정수 값을 사용하지 않는 열 이름

+0

'이야기의 사기'는 최고 : – furas

+0

좋은 지적. '0' 인덱스는 실제로'stack()'단계에서 나온 것이기 때문에 그 부분은 엉망입니다. 하지만 일부 이름을 변경하면 문제가 해결 될 것입니다. –