2016-11-09 903 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

相关问题