Общее решение - работает, если не совпадает row
или val
:
val = 70
row = 10
val = df.reindex(index=[row]).eq(val).squeeze()
col = next(iter(val.index[val]), 'no match')
print (col)
no match
Другое общее решение:
def get_col(row, val):
try:
a = df.loc[row].eq(val)
c = a.index[a][0]
except KeyError:
c = 'not matched row'
except IndexError:
c = 'not matched value'
return c
print (get_col(1, 7))
name3
print (get_col(10, 7))
not matched row
print (get_col(1, 70))
not matched value
print (get_col(10, 70))
not matched row
Решение, если всегда существует val и значения строки в DataFrame
, потому что если не существует и все False возвращаются из df.loc[row].eq(val)
, то idxmax
возвращает первое False
- имя первого столбца.
val = 7
row = 1
col = df.loc[row].eq(val).idxmax()
#if want seelct by pocition use iloc
#col = df.iloc[row].eq(val).idxmax()
print (col)
name3
Объяснение :
Сначала выберите строку по DataFrame.loc
:
print (df.loc[row])
name1 5
name2 6
name3 7
name4 8
Name: 1, dtype: int64
Затем сравните по eq
print (df.loc[row].eq(val))
name1 False
name2 False
name3 True
name4 False
Name: 1, dtype: bool
И последний получить значение индекса первого True
на idxmax
:
print (df.loc[row].eq(val).idxmax())
name3