Как отсортировать строки в кадре данных панд или проверить эквивалентность без учета порядка? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть фрейм данных, и я хочу сравнить 2 переменные (фрейм данных составляет около 20 тыс. Строк; в конечном итоге он достигнет 150 тыс. +).

Я бы хотел сравнить строки, но слова в другом порядке.Если наборы в остальном точно эквивалентны, т. Е. 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 Ответ

1 голос
/ 21 сентября 2019

Вы можете использовать применять в сочетании с коллекциями. Счетчик :

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

Счетчик создает словарь со счетчиком каждой буквы в строке, например:

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

Счетчики равны, если и только равны и ключи, и счетчики, то есть, если и только если строки равнынезависимо от порядка символов.Это решение O(n) для каждой строки против отсортированного подхода, O(n*logn).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...