Python 根据特定于列的条件将函数应用于数据帧的每一列,而不使用循环

Python 根据特定于列的条件将函数应用于数据帧的每一列,而不使用循环,python,pandas,Python,Pandas,我想对数据帧的每一列应用一个函数。 将此应用于哪些行取决于某些特定于列的条件。 要使用的参数值也取决于函数 以这个非常简单的数据帧为例: >>> df = pd.DataFrame(data=np.arange(15).reshape(5, 3)) >>> df 0 1 2 0 0 1 2 1 3 4 5 2 6 7 8 3 9 10 11 4 12 13 14 我想使用数组中包含的特定

我想对数据帧的每一列应用一个函数。
将此应用于哪些行取决于某些特定于列的条件。
要使用的参数值也取决于函数

以这个非常简单的数据帧为例:

>>> df = pd.DataFrame(data=np.arange(15).reshape(5, 3))
>>> df

    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9   10  11
4   12  13  14
我想使用数组中包含的特定于列的值对每个列应用函数,例如:

>>> multiplier = np.array([0, 100, 1000]) # First column multiplied by 0, second by 100...
我还只想将索引在特定于列的范围内的行相乘,比如数组中包含的值:

>>> limiter = np.array([2, 3, 4]) # Only first two elements in first column get multiplied, first three in second column...
有效的方法是:

>>> for i in range(limit.shape[0]):
>>>     df.loc[df.index<limit[i], i] = multiplier[i] * df.loc[:, i]
>>> df

    0   1   2
0   0   100 2000
1   0   400 5000
2   6   700 8000
3   9   10  11000
4   12  13  14
>>适用于范围内的i(limit.shape[0]):
>>>df.loc[测向索引>>测向
0   1   2
0   0   100 2000
1   0   400 5000
2   6   700 8000
3   9   10  11000
4   12  13  14
但是这种方法对于我正在处理的大型数据帧来说太慢了


有什么方法可以将其矢量化吗?

您可以利用底层的numpy数组

df = pd.DataFrame(data=pd.np.arange(15).reshape(5, 3))

multiplier = pd.np.array([0, 100, 1000])
limit = pd.np.array([2, 3, 4])

df1 = df.values

for i in pd.np.arange(limit.size): 
    df1[: limit[i], i] = df1[: limit[i], i] * multiplier[i]

df2 = pd.DataFrame(df1)

print (df2)


     0    1      2
0    0  100    2000
1    0  400    5000
2    6  700    8000
3    9   10   11000
4   12   13      14
表演:

# Your implementation
%timeit for i in range(limit.shape[0]): df.loc[df.index<limit[i], i] = multiplier[i] * df.loc[:, i]
3.92 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# Numpy implementation (High Performance Gain)
%timeit for i in pd.np.arange(limit.size): df1[: limit[i], i] = df1[: limit[i], i] * multiplier[i]
25 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
#您的实现

%timeit for i in range(limit.shape[0]):df.loc[df.index这使我的问题从不可行的长时间变成了闪电般的快。@MPa我很高兴能帮上忙:)