我正在使用pandas 13.0而我正在尝试使用apply()和函数名foo()创建一个新的colum。
我的数据框如下:
df = pandas.DataFrame({
'a':[ 0.0, 0.1, 0.2, 0.3],
'b':[10.0, 20.0, 30.0, 40.0],
'c':[ 1.0, 2.0, 3.0, 4.0]
})
df.set_index(df['a'], inplace=True)
所以我的数据框是:
in: print df
out:
a b c
a
0.0 0.0 10.0 1.0
0.1 0.1 20.0 2.0
0.2 0.2 30.0 3.0
0.3 0.3 40.0 4.0
我的功能如下:
def foo(arg1, arg2):
return arg1*arg2
现在我要创建一个列名称' d'使用foo();
df['d'] = df.apply(foo(df['b'], df['c']), axis=1)
但是我收到以下错误:
TypeError: ("'Series' object is not callable", u'occurred at index 0.0')
如何将pandas.apply()与foo()一起用于由float构成的索引?
由于
答案 0 :(得分:5)
这里的问题是你试图按行进行处理,但是你将系列作为争论传递,这是错误的你可以这样做:
In [7]:
df['d'] = df.apply(lambda row: foo(row['b'], row['c']), axis=1)
df
Out[7]:
a b c d
a
0.0 0.0 10 1 10
0.1 0.1 20 2 40
0.2 0.2 30 3 90
0.3 0.3 40 4 160
更好的方法是直接调用你的函数:
In [8]:
df['d'] = foo(df['b'], df['c'])
df
Out[8]:
a b c d
a
0.0 0.0 10 1 10
0.1 0.1 20 2 40
0.2 0.2 30 3 90
0.3 0.3 40 4 160
上述方法的优点在于它是矢量化的,并且将对整个系列执行操作,而不是一次执行一行。
In [15]:
%timeit df['d'] = df.apply(lambda row: foo(row['b'], row['c']), axis=1)
%timeit df['d'] = foo(df['b'], df['c'])
1000 loops, best of 3: 270 µs per loop
1000 loops, best of 3: 214 µs per loop
这里差别不大,现在与400,000行df相比:
In [18]:
%timeit df['d'] = df.apply(lambda row: foo(row['b'], row['c']), axis=1)
%timeit df['d'] = foo(df['b'], df['c'])
1 loops, best of 3: 5.84 s per loop
100 loops, best of 3: 8.68 ms per loop
所以你看到这里〜672倍加速。