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

Posted

技术标签:

【中文标题】如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?【英文标题】:How to sort strings in pandas dataframe or check equivalency without regard to order? 【发布时间】:2020-01-21 20:55:59 【问题描述】:

我有一个数据框,想比较 2 个变量(数据框大约有 20K 行;最终会达到 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  

我擅长脱衣" ; or + or - or ""

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

【问题讨论】:

你能举一个你的数据框的例子吗?您的预期结果是什么。 @DavidE 添加了一个例子 【参考方案1】:

您可以将apply 与collections.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) 的排序方法。

【讨论】:

以上是关于如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框中对重复的列 ID 进行分组

检查字符串是不是在熊猫数据框中

Python - 在熊猫数据框中对列表中的行进行分组

如何在数据框中对 csv 文件进行排序和连接

如何在熊猫中对月份和年份进行排序以进行时间序列可视化?

在熊猫中对具有多个条件的数据进行排序[关闭]