python - 在 pandas Dataframe 的列上运行函数的有效方法?

标签 python pandas numpy dataframe vectorization

我想在 Pandas Dataframe 的列上运行一个函数。 Corpus 是一个 pd.Dataframe

import pandas as pd 
import numpy as np
from scipy.spatial.distance import cosine

corpus = pd.DataFrame([[3,1,1,1,1,60],[2,2,0,2,0,20], [0,2,1,1,0,0], [0,0,2,1,0,1],[0,0,0,0,1,0]],index=["stark","groß","schwach","klein", "dick"],columns=["d1", "d2", "d3","d4","d5","d6"])

我有疑问。查询是一个 Pandas 系列。

query = pd.Series([1,1,0,0,0], index=["stark","groß","schwach","klein", "dick"])

现在我想对语料库和查询中的每一列运行余弦函数。

for column in corpus:
print("Similarity of Documents", column," and query: \n" ,1-cosine(query, corpus[column]))

是否有更好的方法在列上运行余弦函数?也许有某种方法可以获取列并在每列上运行该函数。我想避免 for 循环。

最佳答案

您可以使用scipy.spatial.distance.cdist's矢量化解决方案的'cosine'功能,就像这样 -

from scipy.spatial.distance import cdist

out = 1-cdist(query.values[None], corpus.values.T, 'cosine')

示例运行 -

In [192]: corpus
Out[192]: 
         d1  d2  d3  d4  d5  d6
stark     3   1   1   1   1  60
groß      2   2   0   2   0  20
schwach   0   2   1   1   0   0
klein     0   0   2   1   0   1
dick      0   0   0   0   1   0

In [193]: query
Out[193]: 
stark      1
groß       1
schwach    0
klein      0
dick       0
dtype: int64

In [194]: from scipy.spatial.distance import cosine

In [195]: for column in corpus:
     ...:     print(1-cosine(query, corpus[column]))
     ...:     
0.980580675691
0.707106781187
0.288675134595
0.801783725737
0.5
0.89431540856

In [196]: 1-cdist(query.values[None], corpus.values.T, 'cosine')
Out[196]: array([[ 0.98058,  0.70711,  0.28868,  0.80178,  0.5    ,  0.89432]])

运行时测试 -

In [225]: corpus = pd.DataFrame(np.random.rand(100,10000))

In [226]: query = pd.Series(np.random.rand(100))

# @C.Square's apply based soln
In [227]: %timeit corpus.apply(lambda x:1-cosine(query, x), axis=0)
1 loop, best of 3: 352 ms per loop

 # Proposed in this post using cdist()
In [228]: %timeit 1-cdist(query.values[None], corpus.values.T, 'cosine')
100 loops, best of 3: 3.2 ms per loop

关于python - 在 pandas Dataframe 的列上运行函数的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973484/

相关文章:

python - 使用 numpy 或 scipy 将 3D 数据数组拟合到 1D 函数

python - 检查单个元素是否包含在 Numpy 数组中

python - 删除 json 数组转换为元组后出现的逗号

python - 将元组组合成列表

python - Powershell - 现在提取传递给脚本的变量名称

python - 如何只读取文本文件中的特定行?

python - 如何根据特定的列组向 DataFrame 添加额外的总和列?

python - 在 Python 中读取科学记数法的指数

python - 迭代从 excel 文件列创建的 pandas 数据框时出错

python - 如何组合两个具有不同行大小的数据框?