猿问

将 Pandas df1 的每一行与 df2 中的每一行进行比较,并从最接近的匹配列返回字符串值

我有两个数据框。


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 中每个人的绝对值。更具体地说,返回最相似的人的名字。


所以在这种情况下,约翰最接近的匹配是 Abe 所以在一个新的列 df1['doppelganger'] = "Abe"中。


我是一个初学者爱好者,所以即使指出我正确的方向也会有所帮助。我一直在查看堆栈溢出大约五个小时,试图弄清楚如何处理这样的事情。


慕桂英546537
浏览 112回答 1
1回答

米琪卡哇伊

首先是需要区分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  sumdiff1     John  236  76  m          Abe  236  75     0     1        17     Jack  204  74  m         Adam  195  71     9     3       1210     Jim  156  71  m         Alex  178  72    22     1       2314   Jared  182  72  m         Alex  178  72     4     0        416    Suzy  119  60  f         Mary  148  66    29     6       3520   Sally  149  66  f         Mary  148  66     1     0        125  Sharon  169  65  f       Maylee  155  66    14     1       1531   Sammy  182  75  f      Madison  160  73    22     2       24输入数据帧:print (df1)            A    B   C0    John  236  761    Jack  204  742     Jim  156  713   Jared  182  724    Suzy  119  605   Sally  149  666  Sharon  169  657   Sammy  182  75print (df2)         A    B   C0    Aaron  285  771      Abe  236  752     Alex  178  723     Adam  195  714     Mary  148  665   Maylee  155  666  Marilyn  199  657  Madison  160  73
随时随地看视频慕课网APP

相关分类

Python
我要回答