Найти столбец из двух данных с максимальным количеством совпадающих записей / значений - PullRequest
1 голос
/ 30 сентября 2019

У меня есть два кадра данных:

dfA
Alpha Beta Gamma
1     apple bana
1     gin   vodka
dfB
Teta heta  hofa
1    apple bana
1    apple vodka

Как найти пару столбцов с максимальным количеством совпадающих объектов? Для двух столбцов довольно легко выполнить слияние или работу с наборами, нужно ли для него написать цикл for?

Я также попытался: dfA.where(dfA.values==dfB.values).notna(), что приводит к ValueError: Array conditional must be same shape as self.

Мой желаемый результат:

Columns         Nr
(Alpha, Teta)   2
(Alpha, heta)   0
(Alpha, hofa)   0
(Beta, Teta)    0
(Beta, heta)    1
(Beta, hofa)    0
(Gamma, Teta)   0
(Gamma, heta)   0
(Gamma, hofa)   2

Предыстория: я должен проверить, совпадают ли записи двух систем, но, к сожалению, системы используют разные имена, и мне нужно определитьведущие колонны.

1 Ответ

2 голосов
/ 30 сентября 2019

Использование product обоих columns имен, проверка членства по Series.isin с количеством True с sum в понимании списка для кортежей и передачей в DataFrame конструктор:

from  itertools import product

L = [((a, b), dfA[a].isin(dfB[b]).sum()) for a, b in product(dfA.columns, dfB.columns)]

df = pd.DataFrame(L, columns=['Columns','Nr'])
print (df)
         Columns  Nr
0  (Alpha, Teta)   2
1  (Alpha, heta)   0
2  (Alpha, hofa)   0
3   (Beta, Teta)   0
4   (Beta, heta)   1
5   (Beta, hofa)   0
6  (Gamma, Teta)   0
7  (Gamma, heta)   0
8  (Gamma, hofa)   2

Очень похожее решение для 3 выходных столбцов:

L = [(a, b, dfA[a].isin(dfB[b]).sum()) for a, b in product(dfA.columns, dfB.columns)]

df = pd.DataFrame(L, columns=['col1','col2','Nr'])
print (df)
    col1  col2  Nr
0  Alpha  Teta   2
1  Alpha  heta   0
2  Alpha  hofa   0
3   Beta  Teta   0
4   Beta  heta   1
5   Beta  hofa   0
6  Gamma  Teta   0
7  Gamma  heta   0
8  Gamma  hofa   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...