Сравнение строк в двух информационных кадрах и подсчет количества похожих столбцов - PullRequest
0 голосов
/ 20 февраля 2019

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

>> df1
ID  Hair  Legs  Feathers
 1    1     0      0
 2    1     2      1
 3    0     2      1

>> df2
ID  Hair  Legs  Feathers
21   1      2     0
22   1      0     1

Я хочу сравнить каждую строку в df2 со всеми строками в df1 и подсчитать количество столбцов, которые похожи в каждой строке df2таким образом, что он дает следующий кадр данных df3

>> df3
ID    Hair  Legs  Feathers  Count
1-21   1      2      0        2
2-21   1      2      0        2
3-12   1      2      0        1
1-22   1      0      1        2
2-22   1      0      1        2
3-22   1      0      1        1

Count вычисляется таким образом, что первая строка df2 сравнивается с первой строкой df1и количество похожих столбцов рассчитывается.Аналогично между первым рядом df2 со вторым рядом df1 и так далее.Более того, вторая строка df2 сравнивается со всеми строками df1 одна за другой и сохраняется в другом фрейме данных df3.

Любая помощь будет высоко оценена

1 Ответ

0 голосов
/ 20 февраля 2019

Я считаю, что вам нужно:

#cross join between both DataFrames
df = df2.assign(A=1).merge(df1.assign(A=1), on='A', suffixes=('','_')).drop('A', axis=1)
#join ID columns and set index
df.index = df.pop('ID_').astype(str) + '_' + df.pop('ID').astype(str)
df.index.name='ID'
print (df)
      Hair  Legs  Feathers  Hair_  Legs_  Feathers_
ID                                                 
1_21     1     2         0      1      0          0
2_21     1     2         0      1      2          1
3_21     1     2         0      0      2          1
1_22     1     0         1      1      0          0
2_22     1     0         1      1      2          1
3_22     1     0         1      0      2          1

cols = df.filter(regex='_$').columns
#compare rows for match and count True values by sum
df['count'] = df[cols.str[:-1]].eq(df[cols].rename(columns=lambda x: x[:-1])).sum(axis=1)

df = df.drop(cols, axis=1).reset_index()
print (df)
     ID  Hair  Legs  Feathers  count
0  1_21     1     2         0      2
1  2_21     1     2         0      2
2  3_21     1     2         0      1
3  1_22     1     0         1      2
4  2_22     1     0         1      2
5  3_22     1     0         1      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...