Можно сравнить все значения DataFrame
и проверить хотя бы одно True
на DataFrame.any
- тогда маска используется для имен столбцов фильтра:
c = df.columns[(df == 36.79).any()].tolist()
Нопотому что работа с плавающей точкой и возможные некоторые проблемы с точностью лучше использовать numpy.isclose
с выбором только числовых столбцов:
#if possible some non numeric columns
df1 = df.select_dtypes(np.number)
c = df1.columns[np.any(np.isclose(df1, 36.79), axis=0)].tolist()
#if all columns are numeric
c = df.columns[np.any(np.isclose(df, 36.79), axis=0)].tolist()
Пример :
print (df)
Date col1 col2 col3 col4 col5 col6 col7
0 01/01/2016 00:00 37.04 36.57 35.77 37.56 36.79 35.9 38.15
1 01/02/2016 00:00 37.04 36.57 35.77 37.56 36.79 35.9 36.79 <-last value changed
df1 = df.select_dtypes(np.number)
c = df1.columns[np.any(np.isclose(df1, 36.79), axis=0)].tolist()
print (c)
['col5', 'col7']
Последнее, если требуется первое найденное значение, если существует возможность, используйте next
с iter
для возможного значения по умолчанию для передачи, если пустой список (без совпадения значений):
print (next(iter(c), 'no match'))
col5
df1 = df.select_dtypes(np.number)
c = df1.columns[np.any(np.isclose(df1, 100), axis=0)].tolist()
print (c)
[]
print (next(iter(c), 'no match'))
no match