首页 > 解决方案 > 如何通过使用 pandas 定义除法函数来获得结果?

问题描述

def set_div(a,b):
    if a==0:
        if b==0:
            return 0
        else:
            return 10**6
    else:
        return b/a

东风:

    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

col a 和 b 的 dtypes 是float64.

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

但它返回KeyError: (0, 'occurred at index a')

我不明白错误,请解释以及如何获得我的结果。

标签: pythonpandas

解决方案


如果想使用为每一行工作的自定义函数DataFrame.apply需要axis=1

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

另一个解决方案numpy.select是矢量化,因此在大型 DataFrame 中性能更好:

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

性能

#[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)

推荐阅读