目录

Pandas实现Excel的vlookup并且在指定列后面输出

目录

Pandas实现Excel的vlookup并且在指定列后面输出

背景:

  • 有两个excel,他们有相同的一个列;
  • 按照这个列合并成一个大的excel,即vlookup功能

要求:

  1. 只需要第二个excel的少量的列,比如从40个列中挑选2个列
  2. 新增的来自第二个excel的列需要放到第一个excel指定的列后面;
  3. 将结果输出到一个新的excel;
import pandas as pd

# 文件路径
grade_path = r'C:\TELCEL_MEXICO_BOT\A\学生成绩表.xlsx'
sinfo_path = r'C:\TELCEL_MEXICO_BOT\A\学生信息表.xlsx'
output_path = r'C:\TELCEL_MEXICO_BOT\A\合并后的数据表.xlsx'  # 保存路径

# 读取数据
df_grade = pd.read_excel(grade_path)
df_sinfo = pd.read_excel(sinfo_path)

# 打印前几行数据
print("学生成绩表:")
print(df_grade)
学生成绩表:
    班级    学号  语文   数学  英语
0  C01  S001  99   84  88
1  C01  S002  66   95  77
2  C01  S003  68   68  61
3  C01  S004  63   66  82
4  C01  S005  72   95  94
5  C01  S006  80   97  97
6  C01  S007  78   95  90
7  C01  S008  56   99  89
8  C01  S009  66  100  97
9  C01  S010  89   99  67

print("\n学生信息表:")
print(df_sinfo)
学生信息表:
     学号  姓名 性别  年龄  籍贯
0  S001  怠涵  女  23  山东
1  S002  婉清  女  25  河南
2  S003  溪榕  女  23  湖北
3  S004  漠涓  女  19  陕西
4  S005  祈博  女  24  山东

# 选择需要的列
df_sinfo = df_sinfo[['学号', '姓名', '性别']]
print(df_sinfo)
     学号  姓名 性别
0  S001  怠涵  女
1  S002  婉清  女
2  S003  溪榕  女
3  S004  漠涓  女
4  S005  祈博  女

# 合并数据.
#左表df_grade,右表df_sinfo, how='left'以左表中的'学号'为键在右表进行vlookup查找
df_merged = pd.merge(df_grade, df_sinfo, how='left', on=['学号'])

# 调整列的顺序
cols = df_merged.columns.tolist()  # 获取所有列名
cols = cols[:2] + cols[-2:] + cols[2:-2]  # 重新排列列的顺序
df_merged = df_merged[cols]

# 打印合并后的数据
print("\n合并后的数据表:")
print(df_merged)
合并后的数据表:
    班级    学号   姓名   性别  语文   数学  英语
0  C01  S001   怠涵    女  99   84  88
1  C01  S002   婉清    女  66   95  77
2  C01  S003   溪榕    女  68   68  61
3  C01  S004   漠涓    女  63   66  82
4  C01  S005   祈博    女  72   95  94
5  C01  S006  NaN  NaN  80   97  97
6  C01  S007  NaN  NaN  78   95  90
7  C01  S008  NaN  NaN  56   99  89
8  C01  S009  NaN  NaN  66  100  97
9  C01  S010  NaN  NaN  89   99  67

# 将合并后的数据保存到指定路径
df_merged.to_excel(output_path, index=False)
print(f"\n合并后的数据已保存到 {output_path}")
合并后的数据已保存到 C:\TELCEL_MEXICO_BOT\A\合并后的数据表.xlsx

vlookup后的异常值处理

# 读取数据
df_grade = pd.read_excel(grade_path)
    班级    学号  语文   数学  英语
0  C01  S001  99   84  88
1  C01  S002  66   95  77
2  C01  S003  68   68  61
3  C01  S004  63   66  82
4  C01  S005  72   95  94
5  C01  S006  80   97  97
6  C01  S007  78   95  90
7  C01  S008  56   99  89
8  C01  S009  66  100  97
9  C01  S010  89   99  67

df_sinfo = pd.read_excel(sinfo_path)
     学号  姓名 性别  年龄  籍贯
0  S001  怠涵  女  23  山东
1  S002  婉清  女  25  河南
2  S003  溪榕  女  23  湖北
3  S004  漠涓  女  19  陕西
4  S005  祈博  女  24  山东

# 选择需要的列
df_sinfo = df_sinfo[['学号', '姓名', '性别']]
print(df_sinfo)
     学号  姓名 性别
0  S001  怠涵  女
1  S002  婉清  女
2  S003  溪榕  女
3  S004  漠涓  女
4  S005  祈博  女

##左表df_grade,右表df_sinfo, 左右两表都有相同列'学号',how=left表示以左表进行vlookup,右表中的V到左表中填充,sort表示是否排序,fillna表示V不到的空值填充

df_merged_2=(df_grade.merge(df_sinfo,on='学号',how = 'left',sort = 'false')).fillna(0)
print(df_merged_2)
    班级    学号  语文   数学  英语  姓名 性别
0  C01  S001  99   84  88  怠涵  女
1  C01  S002  66   95  77  婉清  女
2  C01  S003  68   68  61  溪榕  女
3  C01  S004  63   66  82  漠涓  女
4  C01  S005  72   95  94  祈博  女
5  C01  S006  80   97  97   0  0
6  C01  S007  78   95  90   0  0
7  C01  S008  56   99  89   0  0
8  C01  S009  66  100  97   0  0
9  C01  S010  89   99  67   0  0