#python #pandas #nested-lists
#python #pandas #вложенные списки
Вопрос:
фрейм данных:
col1
[[0.43], [0.46], [1.0], [0.323]]
[[0.33], [0.66], [1.0], [0.3412]]
[[0.27], [0.42], [0.13], [0.332]]
Я пытаюсь создать столбец на основе: если во вложенном списке есть число col11
> = .5, тогда «да», иначе «нет».
Результат:
col1 col2
[[0.43], [0.46], [1.0], [0.323]] yes
[[0.33], [0.66], [1.0], [0.3412]] yes
[[0.27], [0.42], [0.13], [0.332]] no
Также было бы неплохо иметь столбец с местоположением, в котором число было во вложенном списке, которое было>= .5. для приведенного выше df это будет col3: 3,3,N/A
Думая что-то вроде этого:
for i in df.col1:
print(i)
if j in i >= .05:
print(i,"yes")
else:
print(i,"no")
Комментарии:
1. Я мог бы изменить этот столбец вложенных списков на просто списки.. Не уверен, как это сделать. ищем его сейчас
Ответ №1:
Простой apply
должен сделать
df['col2'] = df['col1'].apply(lambda x: max(e[0] for e in x) > 0.5)
Вывод
col1 col2
0 [[0.43], [0.46], [1.0], [0.323]] True
1 [[0.33], [0.66], [1.0], [0.3412]] True
2 [[0.27], [0.42], [0.13], [0.332]] False
Ответ №2:
Вы можете сделать
sub_df = df[pd.DataFrame(df['col1'].apply(lambda x : sum(x,[])).tolist()).ge(0.5).any(1).values]
Ответ №3:
Используйте понимание списка с any
помощью . any
быстрее, чем max
из-за короткого замыкания на True
df['col2'] = [any(y[0] >= 0.5 for y in x) for x in df.col1]
Out[1815]:
col1 col2
0 [[0.43], [0.46], [1.0], [0.323]] True
1 [[0.33], [0.66], [1.0], [0.3412]] True
2 [[0.27], [0.42], [0.13], [0.332]] False
Некоторые тайминги:
df = pd.concat([df]*10000, ignore_index=True)
In [1820]: %timeit [any(y[0] >= 0.5 for y in x) for x in df.col1]
41.2 ms ± 1.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [1823]: %timeit df['col1'].apply(lambda x: max(e[0] for e in x) >= 0.5)
51.9 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
проверка понимания списка с помощью max
In [1827]: %timeit [max(y[0] for y in x) >= 0.5 for x in df.col1]
49.9 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Таким образом, any
быстрее, хотя и незначительно.