Найти, если значение во вложенном подсписке больше, чем X в столбце Pandas

#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 быстрее, хотя и незначительно.