Преобразование серии двумерных массивов Pandas в массив данных Pandas столбцов одномерных массивов 1D - PullRequest
0 голосов
/ 04 декабря 2018

Первый пост в stackoverflow.Я искал и не могу найти ответ на этот вопрос.

У меня есть серия двумерных массивов Pandas:

import numpy as np
import pandas as pd

x1 = np.array([[0,1],[2,3],[3,4]],dtype=np.uint8)
x2 = np.array([[5,6],[7,8],[9,10]],dtype=np.uint8)

S = pd.Series(data=[x1,x2],index=['a','b'])

Вывод S должен выглядеть следующим образом:

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

Я хочу, чтобы он был преобразован в Pandas DataFrame D, где каждый столбец двумерного массива в S становится 1D массивом в столбце D:

D должен выглядеть следующим образом:

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

Обратите внимание, что мой фактический набор данных имеет размер 1238500 массивов (32,8), поэтому я пытался избежать итерации по строкам.

Какой эффективный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Одно решение с np.stack и map

df =  pd.DataFrame(np.stack(map(np.transpose, S)).tolist(), index=S.index)

print (df)

           0           1
a  [0, 2, 3]   [1, 3, 4]
b  [5, 7, 9]  [6, 8, 10]
0 голосов
/ 04 декабря 2018

Вы можете разделить и сжать, не преобразовывая последнее измерение в список питонов.

df = S.apply(np.split, args=[2, 1]).apply(pd.Series).applymap(np.squeeze)

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

В args=[2, 1], 2 обозначает количество столбцов, а 1 обозначает осьнарезать поперек.

Типы:

In [280]: df.applymap(type)
Out[280]: 
                         0                        1
a  <class 'numpy.ndarray'>  <class 'numpy.ndarray'>
b  <class 'numpy.ndarray'>  <class 'numpy.ndarray'>
0 голосов
/ 04 декабря 2018

Я бы сделал так:

# flatten the list
S = S.apply(lambda x: [i for s in x for i in s])

# pick alternate values and create a data frame
S = S.apply(lambda x: [x[::2], x[1::2]]).reset_index()[0].apply(pd.Series)

# name index
S.index = ['a','b']

     0          1
a   [0, 2, 3]   [1, 3, 4]
b   [5, 7, 9]   [6, 8, 10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...