Извлечение из списков серий панд в другой на основе индексов - PullRequest
0 голосов
/ 12 октября 2018

У меня есть фрейм данных pandas, имеющий 2 ряда, каждый из которых содержит 2d массивы, например, a - это первый массив массива различной длины, например

a: 
0 [[1,2,3,4,5,6,7,7],[1,2,3,4,5],[5,9,3,2]]
1 [[1,2,3],[6,7],[8,9,10]]

, а b - второй, но его подмассивимеет только один элемент, такой как

b:
 0 [[0],[2],[3]]
 1 [ [1],[0],[1]]

Я хочу извлечь элементы серии на основе индексов, указанных в b.Результат приведенного выше примера должен выглядеть следующим образом:

0 [1,3,2]
1 [2, 6, 9]

Кто-нибудь может помочь?Большое спасибо

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы можете использовать apply для индексации a с b:

df.apply(lambda row: [row.a[i][row.b[i][0]] for i in range(len(row[0]))], axis=1)   
0    [1, 3, 2]
1    [2, 6, 9]
dtype: object

Данные:

data = {"a":[[[1,2,3,4,5,6,7,7],[1,2,3,4,5],[5,9,3,2]],
             [[1,2,3],[6,7],[8,9,10]]],
        "b": [[[0],[2],[3]], 
              [[1],[0],[1]]]}
df = pd.DataFrame(data)
0 голосов
/ 12 октября 2018

Настройка

a = pd.Series({0: [[1, 2, 3, 4, 5, 6, 7, 7], [1, 2, 3, 4, 5], [5, 9, 3, 2]],
               1: [[1, 2, 3], [6, 7], [8, 9, 10]]})

b = pd.Series({0: [[0], [2], [3]], 1: [[1], [0], [1]]})

Сложно сделать это эффективным, поскольку у вас есть списки разных размеров, но вот решение, использующее понимание списка иzip:

out = pd.Series([[x[y] for x, [y] in zip(i, j)] for i, j in zip(a, b)])

0    [1, 3, 2]
1    [2, 6, 9]
dtype: object
...