You need set_index+ eq:
df = df.set_index('obj1', drop=False).rename_axis(None)
df = df.eq(df['obj1'], axis=0)
print (df)
obj1 obj2 obj3
attr1 True False True
attr2 True False False
attr3 True False False
Similar solution:
df = df.set_index('obj1', drop=False).rename_axis(None)
df = df.eq(df.index.values, axis=0)
print (df)
obj1 obj2 obj3
attr1 True False True
attr2 True False False
attr3 True False False
And numpy solution:
df = pd.DataFrame(df.values == df['obj1'].values[:, None],
index=df['obj1'].values,
columns=df.columns)
print (df)
obj1 obj2 obj3
attr1 True False True
attr2 True False False
attr3 True False False
EDIT:
To compare all the values, this is not easy:
vals = df.stack().unique()
L = [pd.Series(df[x].unique(), index=df[x].unique()).reindex(index=vals) for x in df.columns]
df1 = pd.concat(L, axis=1, keys=df.columns)
print (df1)
obj1 obj2 obj3
attr1 attr1 NaN attr1
attr2 attr2 attr2 NaN
attr3 attr3 attr3 NaN
attrN NaN attrN NaN
df1 = df1.eq(df1.index.values, axis=0)
print (df1)
obj1 obj2 obj3
attr1 True False True
attr2 True True False
attr3 True True False
attrN False True False
EDIT1:
Another solution for df1:
stacked = df.stack()
df1 = stacked.reset_index(name='A').set_index(['level_1','A'])
mux = pd.MultiIndex.from_product([df1.index.levels[0], stacked.unique()])
df1 = df1.reindex(index=mux)
df1['level_0'] = df1['level_0'].mask(df1['level_0'].notnull(),
df1.index.get_level_values(1))
df1 = df1['level_0'].unstack(0)
print (df1)
obj1 obj2 obj3
attr1 attr1 NaN attr1
attr2 attr2 attr2 NaN
attr3 attr3 attr3 NaN
attrN NaN attrN NaN
source
share