Pandas: ошибка памяти при использовании команды «применить» для разделения одного столбца массива на столбцы - PullRequest
1 голос
/ 18 октября 2019

Мне интересно, есть ли у кого-нибудь быстрое исправление ошибки памяти, которая появляется при выполнении того же действия, что и в приведенном ниже примере с большими данными?

Пример:

import pandas as pd
import numpy as np

nRows = 2
nCols = 3

df = pd.DataFrame(index=range(nRows ), columns=range(1))

df2 = df.apply(lambda row: [np.random.rand(nCols)], axis=1)

df3 = pd.concat(df2.apply(pd.DataFrame, columns=range(nCols)).tolist())

Этоэто при создании df3 я получаю ошибку памяти.

DF в примере:

df
     0
0  NaN
1  NaN

df2
0    [[0.6704675101784022, 0.41730480236712697, 0.5...
1    [[0.14038693859523377, 0.1981014890848788, 0.8...
dtype: object

df3
          0         1         2
0  0.670468  0.417305  0.558690
0  0.140387  0.198101  0.800745

Ответы [ 2 ]

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

Во-первых, я думаю, что работать с list s в пандах - это не хорошая идея , если возможно, вы можете избежать этого.

Поэтому я считаю, что вы можете значительно упростить свой код:

nRows = 2
nCols = 3

np.random.seed(2019)
df3 = pd.DataFrame(np.random.rand(nRows, nCols))
print (df3)
          0         1         2
0  0.903482  0.393081  0.623970
1  0.637877  0.880499  0.299172
0 голосов
/ 19 октября 2019

Вот пример с решением проблемы (обратите внимание, что в этом примере списки не используются в столбцах, а вместо этого - в массивах. Этого я не могу избежать, поскольку моя первоначальная проблема связана со списками или массивом в столбце).

import pandas as pd
import numpy as np
import time
np.random.seed(1)

nRows = 25000
nCols = 10000
numberOfChunks = 5

df = pd.DataFrame(index=range(nRows ), columns=range(1))

df2 = df.apply(lambda row: np.random.rand(nCols), axis=1)

for start, stop in zip(np.arange(0, nRows , int(round(nRows/float(numberOfChunks)))), 
                       np.arange(int(round(nRows/float(numberOfChunks))), nRows +  int(round(nRows/float(numberOfChunks))), int(round(nRows/float(numberOfChunks))))):
    df2tmp = df2.iloc[start:stop]
    if start == 0:
        df3 = pd.DataFrame(df2tmp.tolist(), index=df2tmp.index).astype('float16')
        continue
    df3tmp =  pd.DataFrame(df2tmp.tolist(), index=df2tmp.index).astype('float16')
    df3 = pd.concat([df3, df3tmp])
...