Маска на значения:
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
, то подойдет что-то простое, например agg
и dropna
.
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