Применить к столбцам данных, возвращая неожиданные результаты - PullRequest
0 голосов
/ 09 января 2020

Я создал 2 фрагмента кода ниже. Метод 2 работает, но метод 1 возвращает неожиданные 0 / большие числа и хотел бы выяснить, почему.

Коде создает список кадров данных определенной длины строки и столбца (7 x 12) из ​​каждого столбца кадра данных.

Я могу ошибаться, но я бы подумал, что метод 1 будет быстрее / эффективнее? В любом случае, не могли бы вы помочь мне понять, почему метод 1 не работает? Любая помощь будет принята с благодарностью.

import numpy as np
import pandas as pd

rand = pd.DataFrame(np.random.normal(loc=0.0, scale=1.0, size=(20, 10)))
l1, l2 = [], []

# Method 1
rand.apply(lambda x: l1.append(pd.DataFrame(x.values.reshape(4, 5))), axis=0)

# Method 2
for c in range(10):
    l2.append(pd.DataFrame(rand.iloc[:, c].values.reshape(4, 5)))

Мои результаты:

l1 [0]

               0              1              2              3              4
0  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311
1  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311
2  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311
3  1.321088e-311  1.321089e-311  1.321089e-311  1.321089e-311  1.321089e-311

l2 [0]

          0         1         2         3         4
0  1.787913 -0.650952 -0.202825  1.004026  0.117248
1 -0.678082  0.939047  0.483811  0.798136 -0.682002
2  0.159300 -0.168461  1.093911  0.417964 -1.601448
3  0.842667  1.602691  0.898461 -0.797576  1.622104

Примечание - для ясности произвели небольшое редактирование имен переменных.

С уважением

Артур

1 Ответ

0 голосов
/ 09 января 2020

Ваша проблема в том, что append не возвращает сам список, он возвращает None, что поднимает вопрос, почему "Метод 1 возвращает неисследованные 0 / большие числа"? На самом деле он должен возвращать DF с None для каждого столбца.

Простой способ решить вашу проблему - это превратить ваш lambda в функцию:

import numpy as np
import pandas as pd

rand = pd.DataFrame(np.random.normal(loc=0.0, scale=1.0, size=(84, 10)))
mtx1, mtx2 = [], []

def my_lambda(x):
    mtx1.append(pd.DataFrame(x.values.reshape(7, 12)))
    return mtx1

# Method 1
rand.apply(my_lambda, axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...