猿问

如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?

我有一个数据框ex,想比较两个变量bt_x,bt_y(数据框大约有 20K 行;最终会达到 150K+)。


我想比较字符串,但是单词的顺序不同。如果集合在其他方面完全等价,即 'abc' = 'cab',但 'abc' != 'cabe' 那么我想显示匹配,否则不匹配。


目前,所有变量的代码都是这样设置的:


ex['bt M'] = np.where(ex['bt_x'] == ex['bt_y'], 1, 0)

大多数变量都是数字,但有几个字符串我想忽略顺序或 sort。我试过这个:


ex['bt_x_2'] = ''.join(sorted(ex['bt_x']))


新变量“bt_x_2”似乎包含每行数据框中所有“bt_x”行的排序结果。我想对每一行的结果进行排序,独立于所有其他行。换句话说:应用


ex['bt_x_2'] = ''.join(sorted(ex['bt_x']))

或每行的其他方法。我将对两个比较字符串执行此操作,然后检查是否等效。如果有更好的方法那就太好了。我很想听听。在少数情况下,我一直在这里和那里寻找一种好方法。我以前写过一堆正则表达式规则,但最好不要这样做。


示例数据框:


File Name: "file 1.pdf", "file 2.pdf"

bt_x: "Series A + Series B; Series C + D; No Common Shares", "series A-1 + B-1" 

bt_y: "Series C + D; No Common Shares; Series A + Series B", series B-1 + A-1  

dividends_x: .08, .667  

dividends_y: .11, .06667

所需的输出(空格和其他符号最终不重要匹配):


bt_x: "Series A + Series B; Series C + D; No Common Shares", "series A-1 + B-1" 

bt_y: "Series A + Series B, Series C + D; No Common Shares; , series A-1 + B-1  

我擅长剥离字符 " ; 或 + 或 - 或 ""


基本上,是否有一组完全匹配的单词和字母,bt_x是bt_y我想在第三列中回答的问题bt_M(1,0)


慕尼黑8549860
浏览 97回答 1
1回答

白猪掌柜的

您可以将apply与collections.Counter结合使用:import pandas as pdfrom collections import Counterdata = [['abc', 'bca'],        ['aab', 'aba'],        ['abc', 'cabe']]df = pd.DataFrame(data=data, columns=['A', 'B'])df['C_A'] = df.A.apply(Counter)df['C_B'] = df.B.apply(Counter)mask = df.C_A == df.C_Bprint(mask)输出0     True1     True2    Falsedtype: boolCounter 创建一个字典,其中包含字符串中每个字母的计数,例如:'abc' -> Counter({'a': 1, 'b': 1, 'c': 1})当且仅当键和计数都相等时,计数器相等,即,当且仅当字符串相等而不管字符的顺序如何。此解决方案适用O(n)于每个字符串与O(n*logn).
随时随地看视频慕课网APP

相关分类

Python
我要回答