带有 MultiIndex 到 Numpy 矩阵的 Pandas DataFrame

Posted

技术标签:

【中文标题】带有 MultiIndex 到 Numpy 矩阵的 Pandas DataFrame【英文标题】:Pandas DataFrame with MultiIndex to Numpy Matrix 【发布时间】:2016-02-04 03:09:00 【问题描述】:

我有一个带有 2 个索引的 pandas DataFrame。 (MultiIndex)我想得到一个像df.as_matrix(...) 这样的Numpy 矩阵,但这个矩阵的形状是(n_rows, 1)。我想要一个形状为(n_index1_rows, n_index2_rows, 1) 的矩阵。

有没有办法使用.groupby(...) 然后使用.values.tolist().as_matrix(...) 来获得所需的形状?

编辑:数据

                                                              value  
current_date                  temp_date                                        
1970-01-01 00:00:01.446237485 1970-01-01 00:00:01.446237489   30.497100   
                              1970-01-01 00:00:01.446237494    9.584300   
                              1970-01-01 00:00:01.446237455   10.134200   
                              1970-01-01 00:00:01.446237494    7.803683   
                              1970-01-01 00:00:01.446237400   10.678700   
                              1970-01-01 00:00:01.446237373    9.700000   
                              1970-01-01 00:00:01.446237180   15.000000   
                              1970-01-01 00:00:01.446236961   12.928866   
                              1970-01-01 00:00:01.446237032   10.458800

这是一种想法:

np.array([np.resize(x.as_matrix(["value"]).copy(), (500, 1)) for (i, x) in df.reset_index("current_date").groupby("current_date")])

【问题讨论】:

您想要一个 3D 数组?或者只是一个包含索引和列的二维数组? 3D 数组。 np.array 中的所有值都应该是列值(不是索引) 您能否提供一些具有所需输出的示例数据? 完成。忽略时髦的日期时间 对不起,为什么要变成 3D 数组?你有两个索引(i=current_date 和 j=temp_date,大概有一些映射——现在 temp_date 没有排序,所以不清楚)和这些索引指定的值。那不是二维物体吗? 【参考方案1】:

我认为您想要的是取消堆叠多索引,例如

df.unstack().values[:, :, np.newaxis]

编辑:如果您有重复的索引,取消堆叠将不起作用,您可能需要 pivot_table 代替:

pivoted = df.reset_index().pivot_table(index='current_date',
                                       columns='temp_date',
                                       aggfunc='mean')
arr = pivoted.values[:, :, np.newaxis]
arr.shape
# (10, 50, 1)

这是unstack 的完整示例。首先,我们将创建一些数据:

current = pd.date_range('2015', periods=10, freq='D')
temp = pd.date_range('2015', periods=50, freq='D')
ind = pd.MultiIndex.from_product([current, temp],
                                 names=['current_date', 'temp_date'])
df = pd.DataFrame('val':np.random.rand(len(ind)),
                  index=ind)
df.head()
#                               val
# current_date temp_date           
# 2015-01-01   2015-01-01  0.309488
#              2015-01-02  0.697876
#              2015-01-03  0.621318
#              2015-01-04  0.308298
#              2015-01-05  0.936828

现在我们解开多重索引:我们将显示数据的第一个 4x4 切片:

df.unstack().iloc[:4, :4]
#                     val                                 
# temp_date    2015-01-01 2015-01-02 2015-01-03 2015-01-04
# current_date                                            
# 2015-01-01     0.309488   0.697876   0.621318   0.308298
# 2015-01-02     0.323530   0.751486   0.507087   0.995565
# 2015-01-03     0.805709   0.101129   0.358664   0.501209
# 2015-01-04     0.360644   0.941200   0.727570   0.884314

现在提取 numpy 数组,并按照您在问题中指定的方式重塑为 [nrows x ncols x 1]:

vals = df.unstack().values[:, :, np.newaxis]
print(vals.shape)
# (10, 50, 1)

【讨论】:

我在尝试取消堆叠时收到ValueError: Index contains duplicate entries, cannot reshape。我有很多行,其中一些行具有相同的temp_date(但值不同)。我必须解开数百万个索引。有没有办法避免这种情况?重新索引temp_date 或类似的东西? 哦——不知道你有重复。在这种情况下,您需要进行某种聚合以获得所需的结果(并且您必须决定哪种聚合适合您的数据)数据透视表将是一个好方法:请参阅我上面的编辑。跨度>

以上是关于带有 MultiIndex 到 Numpy 矩阵的 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

来自 MultiIndex 和 NumPy 结构化数组 (recarray) 的 Pandas DataFrame

使用带有 numpy 矩阵的 Strassen 算法的输出矩阵不正确

带有 MultiIndex 的 DataFrame 到 dict

带有sklearn的numpy多项式线性回归

带有 pandas groupby multiindex 的箱线图,用于来自 multiindex 的指定子级别

带有 MultiIndex Pandas 面板的切片函数