Во фрейме данных pandas, учитывая два столбца списка, получить доступ к значениям первого столбца на основе значений во втором столбце

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

У меня есть фрейм данных Pandas с двумя столбцами списка:

    df = 
           a                          label
        [1, 2, 4, 5]                    [0, 0, 1, 0]
        [100, 12, 23, 4]                [1, 0, 0, 1]
  

В конечном счете, я хочу сформировать новый столбец a_positive , который также является списком, содержащим все элементы, a для label которых 1 является, поэтому:

  df_output =
         a                                  label                a_positive            
        [1, 2, 4, 5]                    [0, 0, 1, 0]              [4]
        [100, 12, 23, 4]                [1, 0, 0, 1]              [100, 4]
  

Возможно ли это сделать, используя apply и zip объединяя списки вместе??

Ответ №1:

Попробуйте понимание списка

 df['a_positive'] = [[a[i] for i,x in enumerate(b) if x] for a, b in zip(df.a, df.label)]

Out[440]:
                  a         label a_positive
0      [1, 2, 4, 5]  [0, 0, 1, 0]        [4]
1  [100, 12, 23, 4]  [1, 0, 0, 1]   [100, 4]
  

Комментарии:

1. Ваше решение было самым быстрым.

2. Да, понимание списка обычно происходит быстрее всего при работе с фреймом данных, состоящим из строк и списка.

Ответ №2:

Попробуйте с

 df['new']=df.apply( lambda x : [s  for s, t in zip(x['a'],x['label']) if t==1],axis=1)
df
Out[78]: 
                  a         label       new
0      [1, 2, 4, 5]  [0, 0, 1, 0]       [4]
1  [100, 12, 23, 4]  [1, 0, 0, 1]  [100, 4]
  

Ответ №3:

Попробуйте assign

 print(df.assign(a_positive=lambda x: [[df['a'][key][idx] for idx in [c for c, val in enumerate(array) if val == 1]] for key, array in enumerate(df['label'])]))
  

Вывод:

                   a         label a_positive
0      [1, 2, 4, 5]  [0, 0, 1, 0]        [4]
1  [100, 12, 23, 4]  [1, 0, 0, 1]   [100, 4]
  

Ответ №4:

Попробуйте это

 import numpy as np

df['a'] = df['a'].apply(np.array)
df['a_positive'] = df.apply(lambda x: x.a[list(map(bool, x.label))],axis=1)
print(df)
  

Вывод:

                   a         label a_positive
0      [1, 2, 4, 5]  [0, 0, 1, 0]        [4]
1  [100, 12, 23, 4]  [1, 0, 0, 1]   [100, 4]