当前位置: 首页 > news >正文

一道晦涩难懂的Pandas基础题

之前群友分享这样一道Pandas题:

应用pandas模块,导入“python_test.xlsx”的excel中的表格数据(2个sheet)

要求:
将sheet1表数据中Code_A字段按照下列规则替换为sheet2表数据中对应的Code_B字段。
替换规则:
1)、先按City,Year,Month,MonthSort升序排序,然后根据City,Year,Month,MonthSort匹配对应行进行替换
2)、相同City,Year,Month下,Code_A和Code_B的数量可能不同,如果不同,按照下面子规则替换:
(1)Code_A较多时,多出的Code_A暂时不替换(即sheet1的MonthSort大于sheet2的MonthSort的行)
(2)Code_B较多时,多出的Code_B暂时不替换,但相同City,Year后续的月份可能出现Code_A较多的情况,此时将前面月份多出的Code_B按先后顺序替换多出的Code_A。(先多出的Code_B先替换,且多出的Code_B只替换更大月份的Code_A)
(3)最终还剩余多出的Code_A和Code_B不用参与替换。替换只在同City间发生。
3)、最后保留City,Year,Month,MonthSor,Code_A五个字段,将结果导出成excel。将结果excel命名为“result_1.xlsx”
将脚本命名为“python_2.py”
注意:
结果可参考result_reference.xlsx文件的example页;

数据集可以到https://gitcode.net/as604049322/blog_data中下载。

python_test.xlsx中的数据格式如下:

image-20221001221031021

result_reference.xlsx中的结果数据如下:

image-20221001221116987

题目题意很难看懂,我在认真对照答案后,核心点翻译如下:

image-20221001221236077

下面我们解决本题,首先读取并合并数据:

import pandas as pd

excel = pd.ExcelFile("python-test.xlsx")
df1 = excel.parse(0)
df2 = excel.parse(1)
df = df1.merge(df2, how="outer", on=['City', 'Year', 'Month', 'MonthSort'])
df.sort_values(['City', 'Year', 'Month', 'MonthSort'],
               ignore_index=True, inplace=True)
df

image-20221001221600515

然后一个遍历搞定:

for city, df_split in df.groupby("City"):
    idx1 = df_split.index[df_split.Code_A.isnull()].values
    idx2 = df_split.index[df_split.Code_B.isnull()].values
    i, j = 0, 0
    while i < idx1.shape[0] and j < idx2.shape[0]:
        if df_split.loc[idx1[i], "Month"] < df_split.loc[idx2[j], "Month"]:
            df.loc[idx2[j], "Code_B"] = df_split.loc[idx1[i], "Code_B"]
            i += 1
        j += 1
df.dropna(subset=["Code_A"], inplace=True)
df.Code_A = df.Code_B.fillna(df.Code_A)
df = df.drop(columns=["Code_B"]).reset_index(drop=True)
df.to_excel("result_1.xlsx", index=False)
df

image-20221001221652836

经确认结果无误:

df2 = pd.read_excel("result_reference.xlsx")
print(df.compare(df2))
Empty DataFrame
Columns: []
Index: []

对比差异为空。

然后按要求将以下完整代码保存到python_2.py文件中:

import pandas as pd

excel = pd.ExcelFile("python-test.xlsx")
df1 = excel.parse(0)
df2 = excel.parse(1)
df = df1.merge(df2, how="outer", on=['City', 'Year', 'Month', 'MonthSort'])
df.sort_values(['City', 'Year', 'Month', 'MonthSort'],
               ignore_index=True, inplace=True)
for city, df_split in df.groupby("City"):
    idx1 = df_split.index[df_split.Code_A.isnull()].values
    idx2 = df_split.index[df_split.Code_B.isnull()].values
    i, j = 0, 0
    while i < idx1.shape[0] and j < idx2.shape[0]:
        if df_split.loc[idx1[i], "Month"] < df_split.loc[idx2[j], "Month"]:
            df.loc[idx2[j], "Code_B"] = df_split.loc[idx1[i], "Code_B"]
            i += 1
        j += 1
df.dropna(subset=["Code_A"], inplace=True)
df.Code_A = df.Code_B.fillna(df.Code_A)
df = df.drop(columns=["Code_B"]).reset_index(drop=True)
df.to_excel("result_1.xlsx", index=False)

相关文章:

  • 边缘计算:一文理解云边端协同架构中的高性能云计算、边缘计算、云边协同
  • 【算法刷题篇】——算法入门 01 数据结构——栈(一)
  • 使用python进行数据分析(二)
  • C++实现二分法求零点(二分法求零点)
  • SECS/GEM半导体协议介绍
  • ARM接口实验-LED灯实验(A7核)
  • 经典卷积和深度卷积的神经网络
  • 【C语言】一篇文章彻底搞懂变量和常量
  • CSS基础12-canvas
  • javascript时钟的开发制作
  • 应用层协议 —— HTTP(二)
  • Qt之QCompleter的简单使用(自动补全、文本框提示、下拉框提示含源码+注释)
  • MyBatis-Plus(二)
  • Linux-常见命令(三)
  • 【国庆活动】Spring Boot 必知必会的核心理念(二)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • eclipse的离线汉化
  • Electron入门介绍
  • EventListener原理
  • node入门
  • SpriteKit 技巧之添加背景图片
  • v-if和v-for连用出现的问题
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 排序算法学习笔记
  • 如何编写一个可升级的智能合约
  • 网页视频流m3u8/ts视频下载
  • 正则表达式
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)MFC+openGL单文档框架glFrame
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)mysql_MYSQL(三)
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)详解PHP处理密码的几种方式
  • .NET 4.0中的泛型协变和反变
  • .NET gRPC 和RESTful简单对比
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET框架
  • .NET中的Exception处理(C#)
  • ::before和::after 常见的用法
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [ C++ ] 继承
  • [17]JAVAEE-HTTP协议
  • [android] 练习PopupWindow实现对话框
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [GN] Vue3.2 快速上手 ---- 核心语法2
  • [IE编程] 如何在IE8 下调试BHO控件/工具栏(调试Tab进程)