Используйте, np.argwhere
вместе с df.to_numpy
:
rows, cols = np.argwhere(df.to_numpy() == 'H').T
indices = list(zip(df.index[rows], df.columns[cols]))
Или,
indices = df.where(df.eq('H')).stack().index.tolist()
# print(indices)
[(3, 'col3'), (4, 'col1')]
timeit
сравнение всех ответов:
df.shape
(50000, 4)
%%timeit -n100 @Shubham1
rows, cols = np.argwhere(df.to_numpy() == 'H').T
indices = list(zip(df.index[rows], df.columns[cols]))
8.87 ms ± 218 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100 @Scott
r,c = np.where(df == 'H')
_ = list(zip(df.index[r], df.columns[c]))
17.4 ms ± 510 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100 @Shubham2
indices = df.where(df.eq('H')).stack().index.tolist()
26.8 ms ± 165 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100 @Roy
df.index.name = "inx"
t = df.reset_index().melt(id_vars = "inx")
_ = t[t.value == "H"]
29 ms ± 656 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)