【问题标题】:How to reshape pandas 2d MultiIndex to numpy 3d faster?如何更快地将 pandas 2d MultiIndex 重塑为 numpy 3d?
【发布时间】: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 中的每个Caselen(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


【解决方案1】:

解决方案是 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)

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2017-09-18
    • 2016-05-22
    • 2015-10-19
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多