Пакетное преобразование нескольких массивов numpy в фреймы данных pandas

#python #pandas #matrix

#python #pandas #матрица

Вопрос:

Следующий скрипт преобразует несколько квадратных матриц в фреймы данных pandas, сначала вручную, затем в виде функции цикла, а также помечает их строки и столбцы одинаково.

 import numpy as np
import pandas as pd
from numpy.random import rand

A1 = rand(3,3)
A2 = A1*2
A3 = A1*3 #example square matrices, no math pattern implied

labels = ['a','b','c']
 

Ручное преобразование:

 A1 = pd.DataFrame(A1, index=labels, columns=labels)
A2 = pd.DataFrame(A2, index=labels, columns=labels)
A3 = pd.DataFrame(A2, index=labels, columns=labels)
 

Пакетное преобразование (цикл):

 def batch_df(l):
    ll = []
    for A in l:
        A_ = pd.DataFrame(A, index=labels, columns=labels)
        ll.append(A_)
    return ll 

ll = batch_df([A1, A2, A3])
print(len(ll)) #list of unnamed matrices, but I would like them separately : A1, A2, ...
 

Вместо этого я хотел бы возвращать отдельные фреймы данных отдельно, с уникальными именами, а не объединять их в один список без имен, но не знаю, как это сделать:

return A1, A2, A3

Функция должна быть достаточно гибкой для пакетного преобразования любого количества массивов, передаваемых в функцию, а не только 3

Ответ №1:

    
   def batch_df(l):

       ...

       return ll

   # edit the expected return values
   A1, A2, A3 = batch_df([A1, A2, A3])

 

(я не совсем понимаю ваш вопрос)

или

 
import numpy as np
import pandas as pd
from numpy.random import rand

my_dfs = {}
my_dfs['A1'] = rand(3,3)
my_dfs['A2'] = my_dfs['A1'] * 2
my_dfs['A3'] = my_dfs['A1'] * 3 

labels = ['a','b','c']

#----------#
# Do stuff #
#----------#
def batch_df(d):
    
    # loop over the dataframes
    for k, A in d.items():
        # update the value
        my_dfs[k] = pd.DataFrame(A, index=labels, columns=labels)

     # no need to return --> dictionaries are by reference
        
        
batch_df(my_dfs)

 

res: my_dfs[‘A1’]

     a           b           c
a   0.501693    0.506768    0.315132
b   0.382843    0.116506    0.194385
c   0.208627    0.033067    0.121261
 

Комментарии:

1. ll в вопросе указан список. но внутри этого списка находятся отдельные объекты. создание вывода функции ll само по себе дает только один вывод. Вместо этого я хотел бы вывести 3 или более объектов из функции, распакованных из содержимого ll

2. но если вы предоставите равное количество ожидаемых значений -> A1, A2, A3 = < — тогда реальной проблемы нет?

3. или эта сумма неизвестна?

4. Почему вы не используете словарь?

5. код до внесения изменений работал нормально, я только отвечал на ваш вопрос о непонимании