Pandas:如何使用 Numpy 函数而不是 Lambda 函数来获得相同的结果(因为 Numpy 更快)?

Pandas: How to use a Numpy function instead of a Lambda function for the same result (since Numpy is faster)?

下面的命令给我以下错误:ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

为什么以及如何解决?

df['Score'] = np.array(fuzz.ratio(df['Vendor'], df['Company']))

注意 - 我知道下面的命令有效,但我希望使用 numpy,因为我听说它比 lambda 快得多:

df['Score'] = df['Vendor'].apply(lambda x: fuzz.ratio(x, df['Company']))

谢谢!

试试这个,它应该和 numpy 语句做同样的事情

df.apply(lambda x: fuzz.ratio(x.Vendor, x.Company), axis=1)

也就是说,如果 fuzz.ratio 采用不可迭代。

或者也许:

np.apply_along_axis(fuzz.ratio, 0, df['Vendor'], df['Company'] ) 

考虑我的测试数据框:

df =pd.DataFrame([['ACME Factory','ACME Factory Inc.'],['CME Factory Inc.','CMEA Factry'],['ATHMA Inc.','Cypress Hill CO.']],columns=['Vendor','Company'])

df['Score'] = np.array(fuzz.ratio(df['Vendor'].values[0],df['Company'].values[0]))

        Vendor            Company  Score
0      ACME Factory  ACME Factory Inc.          83
1      CME Factory Inc.        CMEA Factry      83
2        ATHMA Inc.   Cypress Hill CO.          83

显然我的分数计算是错误的,我相信这是由于我在安装 python-Levenshtein 时遇到的问题, 这是 fuzzywuzzy 库正常工作的依赖。但我可以摆脱:

 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我可以成功重现。

我不知道所有这些强制转换的性能如何 (.values[0]) 使用 .values 你只能从 datframe 中获取数据,但它位于列表内部,使用 [0] 你可以从列表中获取字符串。

告诉我它是否适合你。

ShadyMBA 建议: