Python 如何使用pandas定义除法函数得到结果?

Python 如何使用pandas定义除法函数得到结果?,python,pandas,Python,Pandas,df: 列a和b的数据类型为float64 a b 0 0.0 0.0 1 30000.0 0.0 2 0.0 0.0 3 32700.0 10000.0 4 51700.0 0.0 但它返回KeyError:(0,'发生在索引a') 我不理解错误,请解释和如何获得我的结果。如果要使用自定义函数为每行工作,需要使用轴=1: df['c'] = df[['a','b']].apply(lambda x:set_div(x[0],x[1]))

df:

列a和b的数据类型为
float64

    a       b
0   0.0     0.0
1   30000.0 0.0
2   0.0     0.0
3   32700.0 10000.0
4   51700.0 0.0
但它返回
KeyError:(0,'发生在索引a')


我不理解错误,请解释和如何获得我的结果。

如果要使用自定义函数为每行工作,需要使用
轴=1

df['c'] = df[['a','b']].apply(lambda x:set_div(x[0],x[1])) 
另一个解决方案是矢量化的,因此在大数据帧中具有更好的性能:

df['c'] = df.apply(lambda x :set_div(x['a'],x['b']), axis=1) 
性能

m1 = df['a'] == 0
m2 = df['b'] == 0
df['c'] = np.select([m1 & ~m2, m1 & m2], [10**6, 0], df['b'] / df['a'])
print (df)
         a        b        c
0      0.0      0.0  0.00000
1  30000.0      0.0  0.00000
2      0.0      0.0  0.00000
3  32700.0  10000.0  0.30581
4  51700.0      0.0  0.00000

您可以通过以下方式使用numpy直接获得所需的结果:

#[50000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)

In [113]: %timeit df['c'] = np.select([m1 & ~m2, m1 & m2], [10**6, 0], df['b'] / df['a'])
1.85 ms ± 32.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [114]: %timeit df['c1'] = df.apply(lambda x :set_div(x['a'],x['b']), axis=1)
1.01 s ± 17.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
输出为:

df['c'] = numpy.where(df.a == 0, numpy.where(df.b == 0, 0, 10**6), df.b/df.a)

print(df)
如果要使用定义的方法本身,则在调用
apply
方法时,必须添加参数
axis=1
,以便它按行而不是按列操作

df['c'] = numpy.where(df.a == 0, numpy.where(df.b == 0, 0, 10**6), df.b/df.a)

print(df)
       a      b        c
0      0      0  0.00000
1  30000      0  0.00000
2      0      0  0.00000
3  32700  10000  0.30581
4  51700      0  0.00000