【发布时间】:2021-12-30 11:17:18
【问题描述】:
我有以下操作:
import pandas as pd
import numpy as np
def some_calc(x,y):
x = x.set_index('Cat')
y = y.set_index('Cat')
y = np.sqrt(y['data_point2'])
vec = pd.DataFrame(x['data_point1'] * y)
grid = np.random.rand(len(x),len(x))
result = vec.dot(vec.T).mul(grid).sum().sum()
return result
sample_size = 100
cats = ['a','b','c','d']
df1 = pd.DataFrame({'Cat':[cats[np.random.randint(4)] for _ in range(sample_size)],
'data_point1':np.random.rand(sample_size),
'data_point2':np.random.rand(sample_size)})
df2 = df1.groupby('Cat').sum().reset_index()
我想使用来自df1 的相关数据点跨df2 行的每一行运行some_calc。
下面的代码运行良好:
df2['Apply'] = df2.apply(lambda x: some_calc(x=df1[df1['Cat']==x['Cat']][['Cat','data_point1']],
y=df1[df1['Cat']==x['Cat']][['Cat','data_point2']]),axis=1)
(我重置了df2 中的索引,因为我不知道如何跨索引应用。
另外,我将Cat 作为索引字段和data_point 作为向量传递给some_calc,因为没有索引v.dot(v.T) 会将点积压缩成一个数字。 .mul() 出现此错误,因为我需要完整的 MxM 矩阵而不是浮点值。我可能在这里做错了什么......)
我目前正在探索如何对上述内容进行矢量化处理,以便当sample_size 增长时,我不会因计算速度变慢而受到阻碍。
我看到在以前的线程中,您可以切换raw=True,以便输入处理np.array,而不是pd.Series。
df2['ApplyRaw'] = df2.apply(lambda x: some_calc(x=df1[df1['Cat']==x['Cat']][['Cat','data_point1']],
y=df1[df1['Cat']==x['Cat']]['Cat','data_point2']),axis=1, raw=True)
但是,它会引发错误:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
我尝试从参数中省略 Cat,但仍然是同样的问题。
我可以使用任何代码改进或技巧来对上述内容进行矢量化吗?
还是我必须修改some_calc?
【问题讨论】:
标签: pandas numpy vectorization apply matrix-multiplication