2014-07-12 236 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爲:第1行,得到的應該是['A', 1, 2],因此,apply()預期的行爲應該是:

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

有什麼事,我誤會了約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()'步驟,因此該部分很糟糕。但我想一些重命名會讓事情正確。 –