Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加速应用功能_Python_Performance_Pandas_Apply - Fatal编程技术网

Python 加速应用功能

Python 加速应用功能,python,performance,pandas,apply,Python,Performance,Pandas,Apply,对于一个相对较大的数据帧(几个100k行),我想创建一个系列,它是apply函数的结果。问题是函数不是很快,我希望它能以某种方式加速 df = pd.DataFrame({ 'value-1': [1, 2, 3, 4, 5], 'value-2': [0.1, 0.2, 0.3, 0.4, 0.5], 'value-3': somenumbers..., 'value-4': more numbers..., 'choice-index': [1, 1, np.nan, 2, 1]

对于一个相对较大的数据帧(几个100k行),我想创建一个系列,它是apply函数的结果。问题是函数不是很快,我希望它能以某种方式加速

df = pd.DataFrame({
 'value-1': [1, 2, 3, 4, 5],
 'value-2': [0.1, 0.2, 0.3, 0.4, 0.5],
 'value-3': somenumbers...,
 'value-4': more numbers...,
 'choice-index': [1, 1, np.nan, 2, 1]
})

def func(row):
  i = row['choice-index']
  return np.nan if math.isnan(i) else row['value-%d' % i]

df['value'] = df.apply(func, axis=1, reduce=True)

# expected value = [1, 2, np.nan, 0.4, 5]
欢迎提出任何建议

更新

通过预缓存选定的列,可以实现非常小的加速比(~1.1)<代码>函数将更改为:

cached_columns = [None, 'value-1', 'value-2', 'value-3', 'value-4']
def func(row):
  i = row['choice-index']
  return np.nan if math.isnan(i) else row[cached_columns[i]]

但我希望能有更大的加速…

我想我找到了一个很好的解决方案(加速~150)

诀窍不是使用
apply
,而是进行智能选择

choice_indices = [1, 2, 3, 4]
for idx in choice_indices:
  mask = df['choice-index'] == idx
  result_column = 'value-%d' % (idx)
  df.loc[mask, 'value'] = df.loc[mask, result_column]

你有没有试过cython,numba,eval+numexpr中的建议?没有,不是为了这个问题。但我认为主要的问题是对apply函数的调用数量,因此,
cython
numba
numexpr
等对缓解这一问题没有多大帮助。