python - 将函数应用于一个 df 中的行和另一 df 中的列的所有组合

标签 python pandas numpy python-xarray

这个问题在结构上就像将行向量和列向量相乘以生成矩阵,然后对所得矩阵的行进行求和。

除了在行向量中每个元素都有两个值 A 和 B,在列向量中每个元素都有两个值 X 和 Y。并且该操作不是乘法,而是计算 A、B、X 和 Y 的函数.

下面的代码实现了目标。但是有没有一种方法可以在不使用循环并诉诸 iterrows() 的情况下做到这一点?在实际问题中,行向量有数千个元素,列向量可以有数百万个元素。

from numpy import sin, cos, exp, nan 
from numpy.random import random

# Sample function that can operate on ndarrays
def myfun(a, b, x, y):
    return sin(a+x), exp(b+y) 

# sort of a "row vector"
df_ab = pd.DataFrame(random([2,6]), 
                     index=['A','B'],
                     columns=['AB%d'%i for i in range(6)])
# sort of a "column vector"
df_xy = pd.DataFrame(random([8,2]), 
                     columns=['X','Y'],
                     index=['XY%d'%i for i in range(8)])

# pre-add columns for the summarized results
df_xy['SUM_FUN0'] = nan
df_xy['SUM_FUN1'] = nan

# for each pair of values X,Y
for _, xy in df_xy.iterrows():
    # calculate myfun with each pair of values A,B
    funout0, funout1 = myfun(df_ab.loc['A'], df_ab.loc['B'], xy.X, xy.Y)
    # summarize and store the result
    xy['SUM_FUN0'] = funout0.sum()
    xy['SUM_FUN1'] = funout1.sum()    

最佳答案

这样的事情怎么样?我尚未测试性能,但 apply 通常比 iterrows 稍好。

import pandas as pd
from numpy import sin, cos, exp, nan, sum
from numpy.random import random
from numba import jit

# Sample function that can operate on ndarrays
@jit(nopython=True)
def myfun(a, b, x, y):
    return sum(sin(a+x)), sum(exp(b+y))

# sort of a "row vector"
df_ab = pd.DataFrame(random([2,6]), 
                     index=['A','B'],
                     columns=['AB%d'%i for i in range(6)])

# sort of a "column vector"
df_xy = pd.DataFrame(random([8,2]), 
                     columns=['X','Y'],
                     index=['XY%d'%i for i in range(8)])

A = df_ab.loc['A'].values
B = df_ab.loc['B'].values

df_xy['SUM_FUN0'], df_xy['SUM_FUN1'] = list(zip(*df_xy.apply(lambda x: myfun(A, B, x['X'], x['Y']), axis=1)))

关于python - 将函数应用于一个 df 中的行和另一 df 中的列的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48542812/

相关文章:

python - 如何在浏览器最小化时使用 selenium webdriver 执行测试

python - 如何用印地语将数据写入文件?

python - pip 或 easy_install 默认指的是哪个版本的 Python?

python - 使用 Pandas 将多个数据框合并为一个

python - 如何在 Python 中有效地计算矩阵乘积内存的稀疏值?

python - Python/Numpy 中的内联列分配

python - read_csv 读取\,作为分隔符

python - 应用特定于行的条件的有效方法

python - 在 Python Pandas 中保存重复计算

python - 逐行比较两个 numpy 数组 ValueError