Как сравнить значения списка строки датафрейма с константным значением?
Имеется датафрейм с колонкой содержащей список значений. Примерно такого вида:
Нужно создать новую колонку, в которой будет сравниваться константное значение с каждым значением списка. Если все значения списка => константного, то True иначе False.
Константное значение имеет тип float.
Пример датафрейма: https://disk.yandex.ru/d/BBm1nZbPMQRO0w
Ответы (3 шт):
Например можно сделать вот таким образом: создадим новый столбец датафрейма под названием isMoreThanConst, в который поместим список булевых значений выражений min('список') >= const (очевидно, что если наименьший элемент массива больше или равен константе, то остальные и подавно будут). Итого получим примерно вот такой код:
import pandas as pd
data = {'list': [[0.9999263286590576, 0.9998618364334106, 0.9998658895492554, 0.9999045133590698, 0.9999297857284546, 0.9999910593032837, 0.9999969005584717, 0.9991536140441895],
[0.9998722076416016, 0.9997316002845764, 0.9999145269393921, 0.9999016523361206, 0.9998788833618164, 0.9998179078102112, 0.9999963045120239, 0.9999744892120361, 0.5516145825386047],
[0.9998689889907837, 0.9999439716339111, 0.9998915195465088, 0.999955415725708, 0.999858021736145, 0.9727897047996521, 0.9992432594299316, 0.9994813799858093, 0.9996439218521118]]}
df = pd.DataFrame(data)
const = 0.99
isMoreThanConst = [min(lst) >= const for lst in data['list']]
df['isMoreThanConst'] = isMoreThanConst
df
UPD: если данные берутся из csv, то пишем таким образом, чтобы преобразовать в список:
csv_data = pd.read_csv('data_example.csv')
lsts = csv_data['symbol_scores'].values.tolist()
for i in range(len(lsts)):
lsts[i] = lsts[i][1:-1] # избавляемся от [ и ] для удобства
lsts[i] = list(map(float, lsts[i].split(','))) # и превращаем в нормальный список вещ. чисел
data = {'list': lsts}
...
потестируйте на ваших данных такой вариант (с примером работает):
import pandas as pd
from ast import literal_eval
limit = 0.9
df = pd.read_csv('data_exmple.csv',index_col='Unnamed: 0')
df['over_limit'] = df.symbol_scores.map(lambda x: min(literal_eval(x))) >= limit
>>> df
'''
id symbol_scores over_limit
580 581 [0.3578193187713623, 0.9660767912864685, 0.293... False
581 582 [0.9996286630630493, 0.9998444318771362, 0.999... True
582 583 [0.9998190999031067, 0.9998939037322998, 0.999... True
Сравнение для каждого значения списка поэлементно
val = 0.5
df["compare"]=df["symbol_scores"].str.extractall('(\d+\.+?\d+)').groupby(level=0)[0].apply(lambda x: [float(y)>val for y in x])
df:
Unnamed: 0 id symbol_scores compare
0 580 581 [0.3578193187713623, 0.9660767912864685, 0.293... [False, True, False, False, True, False, False]
1 581 582 [0.9996286630630493, 0.9998444318771362, 0.999... [True, True, True, True, True, True, True, Tru...
2 582 583 [0.9998190999031067, 0.9998939037322998, 0.999... [True, True, True, True, True, True, True, Tru...
Сравнение для всех значений списка:
df["compare"]=df["symbol_scores"].str.extractall('(\d+\.+?\d+)').groupby(level=0)[0].apply(lambda x: all([float(y)>val for y in x]))
df:
Unnamed: 0 id symbol_scores compare
0 580 581 [0.3578193187713623, 0.9660767912864685, 0.293... False
1 581 582 [0.9996286630630493, 0.9998444318771362, 0.999... True
2 582 583 [0.9998190999031067, 0.9998939037322998, 0.999... True

