Python培训哪家比较好:PythonpandasDataframe比较

关于Python培训哪家比较好的问题,在leetcode pandas中经常遇到, 堆栈溢出的人,救命!

堆栈溢出的人,救命!

我有一个 leetcode 风格的问题给你们。

想象一个场景,你有 2 个 2D 数组,更具体地说是 2 个数据框与熊猫。

我需要比较这 2 个 Dataframes 并突出显示所有差异,但是有一个问题。这些数据帧中可能缺少行,这使得这本身更加困难,以及缺少单元格。我将提供一个例子。

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 工作表,则可以获得奖励积分;)

0

阶段1
一个好的起点是的 StackOverflow 问题:https://stackoverflow.com/a/48647840/15965988

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

阶段2
在此阶段,只存在有差异的行。从这里,我建议循环遍历每一行。对于每一行,您需要创建一些逻辑来查询其他数据帧,以查找类似的行。在查询过程中,请考虑仅使用一些列进行查询。

祝你好运.

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是您的“参考”数据框。

enter image description here

和“df”你正在比较它的数据框。

enter image description here

不同之处在于:

缺少第 0 行和第 3 行

新行 (5)

(0,“d”)等于 99 而不是3

(2,“c”)是 NaN 而不是 10

解决方案

以下解决方案亮点:

[红色]“已删除的行”(未在 df 中显示的行索引)

[绿色]“新行”(不出现在 df_ref 中的行索引)

[橙色] 常见行不同的值

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  

它给出了:

get_dataframes_diff(df, df_ref)

enter image description here

解释

获取已删除行,新行和常见行的列表

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”数据帧

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

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

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

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])

当 True(相同值)时,我们不应用任何样式。当 False 时,我们以橙色突出显示:

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参数的有效路径。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(678)
Ma jun:反转“numpy.ma.compressed”操作
上一篇
User in it:如何在Django中获取当前登录的用户的用户ID
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(57条)