pandas实际应用案例-相似度计算,分组统计,写入excel

写在前面

用笛卡儿积计算成绩相似的10名学生

import pandas as pd
## 数据读取
df = pd.read_excel(r'F:\桌面\成绩表.xlsx')
df
姓名英语数学语文体育
0小红115381541
1小红223958734
2小红333253141
3小红471279714
4小红53454845
..................
345小红34658618413
346小红3478096826
347小红34865643177
348小红3493952685
349小红35080394847

350 rows × 5 columns

1.学生笛卡尔积

df['col_1'] = 1
df
姓名英语数学语文体育col_1
0小红1153815411
1小红2239587341
2小红3332531411
3小红4712797141
4小红534548451
.....................
345小红346586184131
346小红34780968261
347小红348656431771
348小红34939526851
349小红350803948471

350 rows × 6 columns

df_merge = pd.merge(left=df,right=df,left_on='col_1',right_on='col_1')
df_merge # 350*350=122500 为了计算一个学生与350个学生关联
姓名_x英语_x数学_x语文_x体育_xcol_1姓名_y英语_y数学_y语文_y体育_y
0小红1153815411小红115381541
1小红1153815411小红223958734
2小红1153815411小红333253141
3小红1153815411小红471279714
4小红1153815411小红53454845
....................................
122495小红350803948471小红34658618413
122496小红350803948471小红3478096826
122497小红350803948471小红34865643177
122498小红350803948471小红3493952685
122499小红350803948471小红35080394847

122500 rows × 11 columns

2.计算相似度

col_name = list(df.columns)
col_name.remove('姓名')
col_name.remove('col_1')
col_name
['英语', '数学', '语文', '体育']
def sim_fun(row):
    sim_value = 0.0
    for col_ in col_name:
        sim_value += abs(int(row[col_+'_x'])-int(row[col_+'_y'])) # 每列相减,再算和
    return sim_value
df_merge['sim'] = df_merge.apply(sim_fun,axis=1)
df_merge
姓名_x英语_x数学_x语文_x体育_xcol_1姓名_y英语_y数学_y语文_y体育_ysim
0小红1153815411小红1153815410.0
1小红1153815411小红223958734144.0
2小红1153815411小红33325314147.0
3小红1153815411小红471279714176.0
4小红1153815411小红5345484556.0
.......................................
122495小红350803948471小红34658618413114.0
122496小红350803948471小红3478096826118.0
122497小红350803948471小红3486564317787.0
122498小红350803948471小红3493952685134.0
122499小红350803948471小红350803948470.0

122500 rows × 12 columns

## 删除小红1=小红1
df_merge = df_merge[df_merge['姓名_x'] != df_merge['姓名_y']]
df_merge
姓名_x英语_x数学_x语文_x体育_xcol_1姓名_y英语_y数学_y语文_y体育_ysim
1小红1153815411小红223958734144.0
2小红1153815411小红33325314147.0
3小红1153815411小红471279714176.0
4小红1153815411小红5345484556.0
5小红1153815411小红644195876126.0
.......................................
122494小红350803948471小红34512513866109.0
122495小红350803948471小红34658618413114.0
122496小红350803948471小红3478096826118.0
122497小红350803948471小红3486564317787.0
122498小红350803948471小红3493952685134.0

122150 rows × 12 columns

3.提取每个学生相似前10的学生

def get_top_student(df_sub):
    df_sort = df_sub.sort_values(by='sim',ascending=False).head(10)
    names = ','.join(list(df_sort['姓名_y']))
    sims = ','.join([str(x) for x in list(df_sort['sim'])])
    return pd.Series({'names':names,'sims':sims})
df_result = df_merge.groupby('姓名_x').apply(get_top_student)
df_result.to_excel('F:\桌面\相似度计算.xlsx')
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wency(王斯-CUEB)

我不是要饭的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值