微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-熊猫获取最高点积的索引

我有一个这样的数据框:

df1 = pd.DataFrame({'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12]})
    a   b   c
0   1   5   9
1   2   6   10
2   3   7   11
3   4   8   12

我想在此数据框中创建另一列,该列存储每一行​​,当对它进行点积运算时,该另一行得分最高.

例如,对于第一行,我们将针对其他行计算点积:

df1.drop(0).dot(df1.loc[0]).idxmax()
output: 3

因此,我可以创建一个函数

def get_highest(dataframe):
    lis = []
    for row in dataframe.index:
        temp = dataframe.drop(row).dot(dataframe.loc[row])
        lis.append(temp.idxmax())
    return lis

我得到我想要的东西:

df1['highest'] = get_highest(df1)
output: 
    a   b   c   highest
0   1   5   9   3
1   2   6   10  3
2   3   7   11  3
3   4   8   12  2

好的,这是可行的,但问题是它根本无法扩展.以下是不同行数的timeit的输出

4 rows: 2.87 ms
40 rows: 77.1 ms
400 rows: 700 ms
4000 rows: 10.4s

我必须在大约240k行和3.3k列的数据帧上执行此操作.因此,这是我的问题:有没有一种方法可以优化此计算? (可能通过其他方式解决)

先感谢您.

解决方法:

用转置进行矩阵乘法:

mat_mul = np.dot(df.values, df.values.T)

用较小的数字填充对角线,使它们不能为最大值(我假设所有正数都为正,所以用-1填充,但您可以更改此值):

np.fill_diagonal(mat_mul, -1)

现在,使用数组的argmax:

df['highest'] = mat_mul.argmax(axis=1)

10k x 4 df的时间:

%%timeit
mat_mul = np.dot(df.values, df.values.T)
np.fill_diagonal(mat_mul, -1)
df['highest'] = mat_mul.argmax(axis=1)

1 loop, best of 3: 782 ms per loop

%timeit df['highest'] = get_highest(df)
1 loop, best of 3: 9.8 s per loop

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐