создать фрейм данных из объектов списка неравного размера с разными нецелыми указателями - PullRequest
1 голос
/ 26 октября 2019

У меня есть список массивов numpy - например:

Позволяет назвать это LIST_A:

[array([  0.        , -11.35190205,  11.35190205,   0.        ]),
 array([  0.        ,  36.58012599, -36.58012599,   0.        ]),
 array([  0.        , -41.94408202,  41.94408202,   0.        ])]

У меня есть список списков, которые являются указателями для каждого из массивов numy вПриведенный выше список массивов NumPy:

Давайте назовем этот List_B:

[['A_A', 'A_B', 'B_A', 'B_B'],
 ['A_A', 'A_D', 'D_A', 'D_D'],
 ['B_B', 'B_C', 'C_B', 'C_C']]

Я хочу создать pandas dataframe из этих объектов, и я не уверен, как я могу это сделать безсначала создайте объекты серии для каждого из numpy arrays в LIST_A с соответствующим индексом в LIST_B (т. е. индекс LIST_A[0] равен LIST_B[0] и т. д.), а затем выполните pd.concat(s1,s2,s3...), чтобы получить нужный кадр данных.

В приведенном выше случае я могу построить желаемый фрейм данных следующим образом:

s1 = pd.Series(list_a[0], index=list_b[0])
s2 = pd.Series(list_a[1], index=list_b[1])
s3 = pd.Series(list_a[2], index=list_b[2])
df = pd.concat([s1,s2,s3], axis=1)

            0          1          2
A_A   0.000000   0.000000        NaN
A_B -11.351902        NaN        NaN
A_D        NaN  36.580126        NaN
B_A  11.351902        NaN        NaN
B_B   0.000000        NaN   0.000000
B_C        NaN        NaN -41.944082
C_B        NaN        NaN  41.944082
C_C        NaN        NaN   0.000000
D_A        NaN -36.580126        NaN
D_D        NaN   0.000000        NaN

В моем реальном приложении размер перечисленных выше списков исчисляется сотнями, поэтому я не хочу создавать сотни объектов сериии затем объединить их все (разве это единственный способ сделать это?).

Я прочитал различные посты на SO, такие как: Добавление списка с другой длиной в качестве нового столбца вдатафреймы и конвертируют набор пандРисует И объекты данных в массив массивов , но не смогли найти элегантного решения проблемы, когда для создания желаемого кадра данных необходимо создать сотни объектов серии.

1 Ответ

1 голос
/ 26 октября 2019

Не совсем отличается от вашего подхода, но это должно быть довольно быстро:

df = pd.DataFrame(dict(zip(list_b[i], list_a[i])) for i in range(len(list_a))).T         

Вывод:

             0          1          2
A_A   0.000000   0.000000        NaN
A_B -11.351902        NaN        NaN
A_D        NaN  36.580126        NaN
B_A  11.351902        NaN        NaN
B_B   0.000000        NaN   0.000000
B_C        NaN        NaN -41.944082
C_B        NaN        NaN  41.944082
C_C        NaN        NaN   0.000000
D_A        NaN -36.580126        NaN
D_D        NaN   0.000000        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...