Pandas - 使用apply floatededed dataframe创建一个新列

时间:2014-09-08 07:36:23

标签: python pandas

我正在使用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构成的索引?

由于

1 个答案:

答案 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倍加速。