【发布时间】:2019-07-13 10:04:06
【问题描述】:
我有以下运行良好的代码:
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)
但问题是我有 5000 万条记录,这需要很长时间(10 小时)。 有没有更快的方法将 2d pandas 转换为 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)
【问题讨论】:
-
对于
Unique_Cases中的每个Case,len(X.loc[Case])是否始终相同? -
不,这正是问题所在。对于记录数量相同的情况,我已经看到了许多解决方案,但不幸的是,这里不是这种情况:(
-
假设
X = pd.DataFrame({'CaseID':[1,1,1,2], 'col1': [1,2,1,2], 'col2': [1,1,2,2]})。期望的结果是什么?您的代码将生成D形状为(2,)。 -
NumPy 数组是 N 维“矩形”数组。每个轴都有固定的长度。如果您尝试将一个参差不齐的列表列表(例如
[[1,1,2], [2]])转换为 NumPy 数组,NumPy 会返回一个一维对象数组:np.array([[1,1,2], [2]], dtype='object')。没有(有用的)方法可以将其转换为 3D 数组。 -
将其转换为 3D 数组的无用方法是:
np.array([[1,1,2], [2]], dtype='object').reshape(-1,1,1),其形状为(2, 1, 1)。但是在数组末尾添加额外的轴(长度为 1)似乎没有任何用处。
标签: python pandas numpy 3d reshape