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

时间:2019-09-20 19:55:08

标签: python string pandas sorting

我有一个数据框,想要比较2个变量(数据框大约2万行;最终将达到150K +)。

我想比较字符串,但是单词的顺序不同。如果集合完全相同,即abc = cab,但abc!= cabe,那么我想显示一个匹配项,否则显示不匹配项。

当前为所有变量设置的代码如下:

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

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

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)中回答的问题

1 个答案:

答案 0 :(得分:1)

您可以将applycollections.Counter结合使用:

import pandas as pd
from collections import Counter

data = [['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_B
print(mask)

输出

0     True
1     True
2    False
dtype: bool

Counter创建一个字典,其中包含字符串中每个字母的计数,例如:

'abc' -> Counter({'a': 1, 'b': 1, 'c': 1})

当且仅当键和计数相等时,计数器相等,即,当且仅当字符串相等时,才考虑字符的顺序。此解决方案是每个字符串使用O(n),而排序方法是O(n*logn)

相关问题