#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]