社区首页 >问答首页 >Python大熊猫Dataframe比较

Python大熊猫Dataframe比较
EN

Stack Overflow用户
提问于 2022-09-09 13:24:15
回答 2查看 46关注 0票数 -1

堆叠溢出的人,救命!

我对你们来说有个密码风格的问题。

想象一个场景,其中你有2个二维数组,更具体地说,2个数据处理与熊猫。

我需要比较这两个Dataframes和突出所有的差异,但有一个陷阱。这些数据帧中可能缺少行,这就使得这本身就更加困难,同时也会丢失单元格。我来举个例子。

代码语言:javascript
代码运行次数:0
复制
import pandas as pd

x = [[0, 1, 2, 3],[4, 5, 6, 7],[8, 9, 10, 11],[12, 13, 14, 15]]
y = [[nan, 1, 2, 3],[4, 5, 6, nan],[12, 13, 14, 15]]

df1 = pd.DataFrame(x)
df2 = pd.DataFrame(y)

如何识别所有丢失的单元格和丢失的行?

如果您可以创建代码来突出显示差异并将它们导出到excel工作表中,则可以获得额外的积分;)

EN

回答 2

Stack Overflow用户

发布于 2022-09-09 13:32:22

阶段1

一个很好的起点是以下StackOverflow问题:https://stackoverflow.com/a/48647840/15965988

这将从两个表中删除100%重复的行。

阶段2

在此阶段,只存在有差异的行。从这里开始,我建议在每一行上循环。对于每一行,您都需要创建一些逻辑,以查询另一个dataframe,寻找类似的行。在该查询期间,请考虑只使用某些列进行查询。

祝你好运。

票数 0
EN

Stack Overflow用户

发布于 2022-09-09 16:52:48

示例数据集

稍微调整一下示例数据,让我们定义以下数据:

代码语言:javascript
代码运行次数:0
复制
import pandas as pd
import numpy as np
x = [[0, 1, 2, 3],[4, 5, 6, 7],[8, 9, 10, 11],[12, 13, 14, 15]]
y = [[4, 5, 6, 99],[8, 9, np.nan, 11],[12, 13, 14, 15]]

df_ref = pd.DataFrame(x, index=range(4), columns=["a", "b","c","d"])
df = pd.DataFrame(y, index=[1,2,5], columns=["a", "b","c","d"])

df_ref是您的“参考”数据。

和"df“的数据,您正在比较它。

不同之处是:

  • 行0和3缺少
  • 新行(5)
  • (0,"d")等于99,而不是3
  • (2,"c")是NaN而不是10

F 213

解决方案

以下解决方案突出说明:

红色的

  • (未出现在df中的行索引)
  • 中的“新行”(未出现在df_ref中的行索引)
  • 中的橙色--公共行

的不同值

代码语言:javascript
代码运行次数:0
复制
def get_dataframes_diff(df: pd.DataFrame, df_ref: pd.DataFrame, path_excel = None):
    rows_new = df.index[~df.index.isin(df_ref.index)]
    rows_del = df_ref.index[~df_ref.index.isin(df.index)]
    rows_common = df_ref.index.intersection(df.index)

    df_diff = pd.concat([df, df_ref.loc[rows_del]]).sort_index()
    s = df_diff.style

    def format_row(row, color: str = "white", bg_color: str = "green"):
        return [f"color: {color}; background-color: {bg_color}"] * len(row)

    s.apply(format_row, subset = (rows_new, df.columns), color="white", bg_color="green", axis=1)
    s.apply(format_row, subset = (rows_del, df.columns), color="white", bg_color="red", axis=1)

    mask = pd.DataFrame(True, index=df_diff.index, columns=df_diff.columns)
    mask.loc[rows_same] = (df_ref.loc[rows_same] == df.loc[rows_same])
    mask.replace(True, None, inplace=True)
    mask.replace(False, "color: black; background-color: orange;", inplace=True)

    s.apply(lambda _: mask, axis=None)

    if path_excel is not None:
        s.to_excel(path_excel)
    return s  

它规定:

代码语言:javascript
代码运行次数:0
复制
get_dataframes_diff(df, df_ref)

解释

获取已删除行、新行和公共行的列表。

代码语言:javascript
代码运行次数:0
复制
rows_new = df.index[~df.index.isin(df_ref.index)]
rows_del = df_ref.index[~df_ref.index.isin(df.index)]
rows_same = df_ref.index.intersection(df.index)

通过将已删除的行添加到df数据框架中,创建"diff“数据

代码语言:javascript
代码运行次数:0
复制
df_diff = pd.concat([df, df_ref.loc[rows_del]]).sort_index()

使用Styler.apply以绿色突出显示新行,并将已删除的行改为红色(注意subset参数的使用):

代码语言:javascript
代码运行次数:0
复制
def format_row(row, color: str = "white", bg_color: str = "green"):
    return [f"color: {color}; background-color: {bg_color}"] * len(row)

df_diff.style.apply(format_row, subset = (rows_new, df.columns), color="white", bg_color="green", axis=1)
df_diff.style.apply(format_row, subset = (rows_del, df.columns), color="white", bg_color="red", axis=1)

要突出显示公共行的值差异,请创建一个掩码数据,对于相同的元素等于True,在值不同时创建False

代码语言:javascript
代码运行次数:0
复制
mask = pd.DataFrame(True, index=df_diff.index, columns=df_diff.columns)
mask.loc[rows_common] = (df_ref.loc[rows_common] == df.loc[rows_common])

当真(相同的值),我们不应用任何样式。当假的时候,我们用橙色突出显示:

代码语言:javascript
代码运行次数:0
复制
mask.replace(True, None, inplace=True)
mask.replace(False, "color: black; background-color: orange;", inplace=True)

df_diff.style.apply(lambda _: mask, axis=None)

最后,如果要将其保存为excel文件,请提供指向path_excel参数的有效路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73667608

复制
相关文章
Lucene系列(十)索引格式之pos文件
因此文件格式与doc总体上讲也是基本相同的,因为不用存储跳跃数据(doc文件中的跳跃数据包含了pos文件的文件位置,可以协助查找),文件反而简单了许多.
呼延十
2021/03/15
1.8K0
【说站】python如何定义索引模块类
2、索引一般都是通过文章标识来索引文章内容,而倒排索引正好相反,通过文章内容来索引文章标识。
很酷的站长
2022/11/23
4060
【说站】python如何定义索引模块类
类索引和父类索引
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类全限定名。由于java语言不允许多重继承,所以父类索引只有一个。
不会飞的小鸟
2020/06/14
8120
4、web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象
天降攻城狮
2019/07/03
1.1K0
4、web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
weex-24-modal模块
如果你觉得这些界面颜色风格和你的应用配色格格不入,你可以自定义自己想要的类似的组件!
酷走天涯
2018/09/14
9920
weex-24-modal模块
类模块
类是一种特殊的代码组织方式,普通模块写的代码是Sub过程、或者Function函数,而类模块里的代码,它都属于这个类,在它内部也可以有Sub过程、或者Function函数,但和普通模块里不同的是,它在使用之前,必须要先创建类的实例,也就是和VBA使用外部对象字典等那样,要New一个:
xyj
2020/07/28
7410
一起学Excel专业开发24:使用类模块创建对象3
在《一起学Excel专业开发23:使用类模块创建对象2》中,我们自定义的集合类存在两个方面的不足:
fanjy
2019/11/11
9410
一起学Excel专业开发24:使用类模块创建对象3
第24期:索引设计(多值索引的适用场景)
多值索引和基于多个字段的联合索引完全不同,联合索引是基于多个一维字段,比如字段 r1 int, r2 int,r3 int,这三个字段的组合是联合索引。一般用于三个字段的联合查找,比如 r1 = 1 and r2 = 2 and r3 = 2 等等。
爱可生开源社区
2021/04/07
6970
小程序<live-pusher>、<live-player>标签无法正常使用?
出于政策和合规的考虑,微信暂时没有放开所有小程序对 <live-pusher> 和 <live-player> 标签的支持:
hhualiu
2019/03/11
2.2K0
小程序<live-pusher>、<live-player>标签无法正常使用?
解决BRAT无法标注中文标签
你的配置文件,也就是**anntation.conf**,一定要是**UTF-8**编码的。
用户7483561
2020/06/29
1.1K0
Python基础24-MySQL模块pymysql
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2.7K0
Python基础24-MySQL模块pymysql
nginx模块上下文索引和索引
index : 是所有模块在ngx_modules.c文件中的ngx_modules数组中的序号,它与ngx_modules数组中所有模块的顺序是一致的。
随心助手
2022/11/30
2970
类模块——举例
前面使用Open 进行的文件操作,使用起来不是很方便,但是FileSystemObject里的TextStream使用起来就比较方便了,知道了类之后,就可以使用类对Open的文件操作进行包装。
xyj
2020/07/28
5430
类模块——接口
类模块另外一种更为抽象的用法是作为接口,Excel VBA中没有真正的接口这种东西,接口也是使用类来实现的。
xyj
2020/07/28
4380
类模块——接口
TrickBot银行木马最新的POS相关模块psfin32分析
TrickBot通过不断增加窃取用户凭证的新模块而不断进化,我们已发布的最新进展是关于它的pwgrab32模块。最近,我们又发现了一个新的POS相关的恶意模块,使得该银行木马更加危险。一旦受感染的计算机连接到支持POS服务和设备的网络,新模块将开始活动。
FB客服
2018/12/25
6190
TrickBot银行木马最新的POS相关模块psfin32分析
Hibernate 4 升级到 5 后显示未知实体错误
请参考: Hibernate 4 升级到 Hibernate 5 的时候 SessionFactory 不能使用 中的内容。
HoneyMoose
2019/10/18
6930
Hibernate 4 升级到 5 后显示未知实体错误
PHP pos() 函数
每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。
用户1448800
2021/08/21
1.9K0
4. html块标签、含样式的标签
“仅供学习,转载请注明出处” html块标签 1、<div> 标签 块元素,表示一块内容,没有具体的语义。 2、<span> 标签 行内元素,表示一行中的一小段内容,没有具体的语义。 “编写一个示例如下:” <!DOCTYPE html> <html> <head> <title></title> </head> <body> <!-- span 不换行 --> <span>我</span> <span>是</span> <span>肥</span> <span>白</span> <!-- d
Devops海洋的渔夫
2022/01/14
1.5K0
4. html块标签、含样式的标签
Sparkml库标签和索引之间转化
StringIndexer StringIndexer将一串字符串标签编码为一列标签索引。这些索引范围是[0, numLabels)按照标签频率排序,因此最频繁的标签获得索引0。如果用户选择保留它们,那么看不见的标签将被放在索引numLabels处。如果输入列是数字,我们将其转换为字符串值并将为其建索引。当下游管道组件(例如Estimator或 Transformer使用此字符串索引标签)时,必须将组件的输入列设置为此字符串索引列名称。在许多情况下,您可以使用设置输入列setInputCol。 例1, 假如
Spark学习技巧
2018/01/31
7240
Hibernate 4 升级到 5 后显示未知实体错误
请参考: Hibernate 4 升级到 Hibernate 5 的时候 SessionFactory 不能使用 中的内容。
HoneyMoose
2019/10/15
6460
Hibernate 4 升级到 5 后显示未知实体错误

相似问题

java.lang.IllegalStateException:未知标签!pos=40 poolCount = 47

10

JBoss EAP7.0 java.lang.IllegalStateException:未知标签!pos=3 poolCount = 20警告

12

无法索引类模块-info.class

10

jbas015852无法索引类java.lang.IllegalStateException:未知标记

17

Weblogic 12c无法解析类文件hikaricp-3.4.5模块-info.class

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档