Сравните каждую строку Pandas df1 с каждой строкой в ​​df2 и верните строковое значение из ближайшего соответствующего столбца - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть два фрейма данных.

df1 включает 4 мужчин и 4 женщин с их весом и ростом (дюймы).

#df1
John, 236, 76
Jack, 204, 74
Jim, 156, 71
Jared, 182, 72
Suzy, 119, 60
Sally, 149, 66
Sharon, 169, 65
Sammy, 182, 75

df2 включает 4 мужчин и 4 женщин с их весом и рост (дюймы).

#df2
Aaron, 285, 77
Abe, 236, 75
Alex, 178, 72
Adam, 195, 71
Mary, 148, 66
Maylee, 155, 66
Marilyn, 199, 65
Madison, 160, 73

То, что я пытаюсь сделать, - это сравнить мужчин из df1 с мужчинами из df2, чтобы узнать, на кого они больше всего похожи, исходя из роста и веса. Просто вычтите вес из веса и рост из роста и верните абсолютное значение для каждого мужчины в df2. Точнее, верните имя человека, который наиболее похож было бы полезно указать мне правильное направление. Я около пяти часов просматриваю переполнение стека, пытаясь выяснить, как go примерно так.

1 Ответ

1 голос
/ 12 апреля 2020

Сначала необходимо различить guish men и women, здесь используется новый столбец с повторением 4 раза m и f. Затем используется DataFrame.merge с внешним объединением новым столбцом для всех комбинаций и создаются новые столбцы для различий, последний столбец составляет sum из них. затем сортировка по 3 столбцам по DataFrame.sort_values, поэтому первая строка по группам по A и g фильтруется по DataFrame.drop_duplicates:

df = (df1.assign(g = ['m']*4 + ['f']*4)
          .merge(df2.assign(g = ['m']*4 + ['f']*4), on='g', how='outer', suffixes=('','_'))
          .assign(dif1 = lambda x: x['B'].sub(x['B_']).abs(),
                  dif2 = lambda x: x['C'].sub(x['C_']).abs(),
                  sumdiff = lambda x: x['dif1'] + x['dif2'])
          .sort_values(['A', 'g','sumdiff'])
          .drop_duplicates(['A','g'])
          .sort_index()
          .rename(columns={'A_':'doppelganger'})
          )
print (df)
         A    B   C  g doppelganger   B_  C_  dif1  dif2  sumdiff
1     John  236  76  m          Abe  236  75     0     1        1
7     Jack  204  74  m         Adam  195  71     9     3       12
10     Jim  156  71  m         Alex  178  72    22     1       23
14   Jared  182  72  m         Alex  178  72     4     0        4
16    Suzy  119  60  f         Mary  148  66    29     6       35
20   Sally  149  66  f         Mary  148  66     1     0        1
25  Sharon  169  65  f       Maylee  155  66    14     1       15
31   Sammy  182  75  f      Madison  160  73    22     2       24

Входные фреймы данных:

print (df1)    
        A    B   C
0    John  236  76
1    Jack  204  74
2     Jim  156  71
3   Jared  182  72
4    Suzy  119  60
5   Sally  149  66
6  Sharon  169  65
7   Sammy  182  75

print (df2)
         A    B   C
0    Aaron  285  77
1      Abe  236  75
2     Alex  178  72
3     Adam  195  71
4     Mary  148  66
5   Maylee  155  66
6  Marilyn  199  65
7  Madison  160  73
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...