我有一些问题与熊猫应用功能,当使用多个列与以下数据框架
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
下面的函数
def my_test(a, b):
return a % b
当我试图应用这个函数与:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
我得到了错误信息:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
我不理解这条消息,我正确地定义了名称。
如果在这个问题上有任何帮助,我将不胜感激
更新
谢谢你的帮助。我确实犯了一些语法错误的代码,索引应该放在”。然而,我仍然得到相同的问题使用更复杂的函数,如:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
上面所有的建议都有效,但是如果你想让你的计算更有效,你应该利用numpy向量运算(正如这里指出的)。
import pandas as pd
import numpy as np
df = pd.DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
例1:使用pandas.apply()进行循环:
%%timeit
def my_test2(row):
return row['a'] % row['c']
df['Value'] = df.apply(my_test2, axis=1)
最慢的跑步时间是最快的7.49倍。这可能
意味着正在缓存中间结果。1000个循环,最好的
3:4 81µs /环路
例2:使用pandas.apply()进行矢量化:
%%timeit
df['a'] % df['c']
最慢的跑时间是最快的跑时间的458.85倍。这可能
意味着正在缓存中间结果。10000个循环,最好的
3: 70.9µs /回路
例3:使用numpy数组向量化:
%%timeit
df['a'].values % df['c'].values
最慢的跑步时间是最快的7.98倍。这可能
意味着正在缓存中间结果。100000循环,最好
每回路3:6.39µs
因此,使用numpy数组进行向量化将速度提高了近两个数量级。
我已经对上述三种方法进行了比较。
使用值
%timeit df['value'] = df['a'].values % df['c'].values
139µs±1.91µs / loop(平均±std. dev. 7次运行,每次10000次循环)
没有值
%timeit df['value'] = df['a']%df['c']
216µs±1.86µs / loop(平均±std. dev. 7次运行,每个循环1000次)
应用函数
%timeit df['Value'] = df.apply(lambda row: row['a']%row['c'], axis=1)
474µs±5.07µs / loop(平均±std. dev. 7次运行,每个循环1000次)