gpt4 book ai didi

python - 报告两个相同形状的数据帧之间的差异/值变化

转载 作者:行者123 更新时间:2023-11-28 20:13:28 25 4
gpt4 key购买 nike

上下文是我想比较两个 df 并找出差异。

这是 df 和 df2 的一个小区别:

df = pd.DataFrame({'a': range(3),
'b': range(3)})

df2 = df.copy()
df2.iloc[1,1] = 100

比较它们会产生相同形状的二维 bool df:

df != df2
Out[28]:
a b
0 False False
1 False True
2 False False

我试图提取与 True 对应的元素,但其他元素(我不想要的)仍然以 NaN 出现

df[df != df2]
Out[29]:
a b
0 NaN NaN
1 NaN 1.0
2 NaN NaN

如何只提取对应于 True 和索引的元素(所以我知道 df 中的位置):

df[df != df2] # somehow?
Out[30]:
b
1 1.0

更新:上面的例子只有一个True。在有多个 True 的一般情况下,我认为有两种情况:

  1. df 很小,可能有人想看看:

    df = pd.DataFrame({'a': range(3),
    'b': range(3)})

    df2 = df.copy()
    df2.iloc[0,0] = 100
    df2.iloc[1,1] = 100

    df[df!=df2].dropna(how='all',axis=(0,1)) # U9-Forward's answer
    Out[39]:
    a b
    0 0.0 NaN
    1 NaN 1.0
  2. df 很大,你可能想看看:

    index    column   df_value     df2_value
    0 a 0.0 100
    1 b 1.0 100

@U9-Forward 的回答非常适用于情况 1,并且只有一个 True。

@coldspeed 提供了一个全面的解决方案。谢谢!

最佳答案

屏蔽值:

df.values[df != df2]
# array([1])

这个案例应该怎么处理?

df2.at[0, 'a'] = 100

df
a b
0 0 0
1 1 1
2 2 2

df2
a b
0 100 0
1 1 100
2 2 2

df != df2
a b
0 True False
1 False True
2 False False

df.values[df != df2]
# array([0, 1])

# in the other answer
df[df!=df2].dropna(how='all',axis=(0,1))
a b
0 0.0 NaN
1 NaN 1.0

所需的输出是什么?


如果您只是在 df 的每一列中的值不同,那么像 aggdropna 这样简单的东西就可以了。

df[df != df2].agg(lambda x: x.dropna().tolist())

a [0.0]
b [1.0]
dtype: object

如果你想要索引和列,使用melt:

u = df2.reset_index().melt('index')
v = df.reset_index().melt('index')

u[u['value'] != v['value']]
index variable value
0 0 a 100
4 1 b 100

或者,使用 np.nonzero,用 numpy 来做到这一点——真值是非零的,它们的索引被返回。

m = (df != df2).values
idx, cols = np.nonzero(m)

pd.DataFrame({
'index': df.index.values[idx],
'column': df.columns.values[cols],
'value_1': df.values[m],
'value_2': df2.values[m]
})

index column value_1 value_2
0 0 a 0 100
1 1 b 1 100

关于python - 报告两个相同形状的数据帧之间的差异/值变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54059466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com