ser1 = pd.Series([[1, 2, 3], [4], [7, 8]])
ser2 = pd.Series([[True, False, True], [False], [True, True]])
Есть несколько способов сделать это, но я бы не рекомендовал apply
.Один из вариантов - zip
серии и фильтрации с использованием логической индексации numpy:
pd.Series([np.array(x)[y] for x, y in zip(ser1, ser2)])
0 [1, 3]
1 []
2 [7, 8]
dtype: object
Если вам нужен результат в виде списка, вызовите .tolist
в конце:
output = pd.Series([list(np.array(x)[y]) for x, y in zip(ser1, ser2)]).tolist()
output
# [[1, 3], [], [7, 8]]
Вы также можете сделать это чистым списком Python для компоновки со вложенным списком.
pd.Series([
[i for i, j in zip(x, y) if j] for x, y in zip(ser1, ser2)])
0 [1, 3]
1 []
2 [7, 8]
dtype: object
Я рекомендую это ДЛЯ МАЛЫХ СПИСКОВ , потому что преобразование списков в массивы (как сделанопервое решение) требует значительных накладных расходов.
Если вариант сглаживания ваших списков - вариант, вам следует подумать об этом, потому что это, вероятно, будет самым быстрым вариантом.
from itertools import chain
ser3 = np.array(list(chain.from_iterable(ser1)))
ser4 = np.array(list(chain.from_iterable(ser2)))
ser3[ser4]
# array([1, 3, 7, 8])
К сожалениюВы теряете структуру своего ввода, но если это не проблема, это победитель.