2016-11-09 905 views
1

我需要使用lambda函數來逐行計算。例如,使用「MYFUNC」創建一些數據幀python pandas - 'Series'對象沒有屬性

import pandas as pd 
import numpy as np 

def myfunc(x, y): 
    return x + y 

colNames = ['A', 'B'] 
data = np.array([np.arange(10)]*2).T 

df = pd.DataFrame(data, index=[range(0, 10)], columns=colNames) 

這確實工作

df['D'] = (df.apply(lambda x: myfunc(x.A, x.B), axis=1)) 

但第二種情況下不能正常工作!

df['D'] = (df.apply(lambda x: myfunc(x.colNames[0], x.colNames[1]), axis=1)) 

給錯誤

AttributeError: ("'Series' object has no attribute 'colNames'", u'occurred at index 0') 

我真的需要使用第二種情況(使用訪問列表中colNames),它給出了一個錯誤,就如何做到這一點任何線索?

感謝

+2

只需使用括號:'X [colNames [0]'(有哪些討論點符號和括號之間的差異問題,我想這可以被標記爲。一個重複的,如果任何人都可以找到鏈接)。 – ayhan

+0

謝謝,它的作品!寫這個答案,並接受它! –

+0

嚴格來說,如果您想從'x'本身獲取列名,請使用'x [x.index [0]]'。 –

回答

5

當您使用df.apply(),你的數據幀中的每一行都會被傳遞給你的lambda函數作爲熊貓系列。該框架的列將成爲該系列的索引,您可以使用series[label]訪問值。

所以這應該工作:

df['D'] = (df.apply(lambda x: myfunc(x[colNames[0]], x[colNames[1]]), axis=1)) 
+0

而'x.colNames [0]'不起作用的原因是點語法的用法非常有限。它通常用於訪問屬性,熊貓提供它訪問列,但該屬性本身不能是變量。 – ayhan

相關問題