Как преобразовать панды 2d MultiIndex в Numpy 3D быстрее? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующий код, который хорошо работает:

import pandas as pd
import numpy as np

X = pd.DataFrame({'CaseID':[1,1,2,2],
              'col1':  [1,2,1,2],
              'col2':  [1,1,2,2]})
X.set_index(['CaseID','col1'], inplace=True) #MultiIndex

Unique_Cases = X.index.levels[0]
print(Unique_Cases)
#[1, 2]

D = [X.loc[Case].values for Case in Unique_Cases]
print(np.array(D).shape)
#(2, 2, 1)

Но проблема в том, что у меня 50 миллионов записей, и это занимает много времени (10 часов).Есть более быстрый способ превратить 2d панд в массив 3d numpy?

уточнение:

len(X.loc[Case])

Не всегда одинаковая длина.

Решение:

case_counts = X.CaseID.value_counts().to_frame('counts').sort_index()
case_counts['count_cumsum'] = case_counts.counts.cumsum()
#drop the last row for split
case_counts.drop(case_counts.tail(1).index,inplace=True)
cat_values = X[cat].values
cat_values = np.split(cat_values, case_counts.count_cumsum)

1 Ответ

0 голосов
/ 04 марта 2019

Решение np.split:

case_counts = X.CaseID.value_counts().to_frame('counts').sort_index()
case_counts['count_cumsum'] = case_counts.counts.cumsum()
#drop the last row for split
case_counts.drop(case_counts.tail(1).index,inplace=True)
cat_values = X[cat].values
cat_values = np.split(cat_values, case_counts.count_cumsum)
...