将具有多索引的数据帧转换为Numpy矩阵

将具有多索引的数据帧转换为Numpy矩阵,numpy,pandas,matrix,Numpy,Pandas,Matrix,我有一个带有2个索引的熊猫数据帧。(多索引)我想得到一个Numpy矩阵,类似于df.as_矩阵(…),但是这个矩阵有形状(n_行,1)。我想要一个形状矩阵(n\u index1\u行,n\u index2\u行,1) 有没有办法使用.groupby(…)然后使用.values.tolist()或.as_矩阵(…)来获得所需的形状 编辑:数据 value current_

我有一个带有2个索引的熊猫数据帧。(多索引)我想得到一个Numpy矩阵,类似于
df.as_矩阵(…)
,但是这个矩阵有形状
(n_行,1)
。我想要一个形状矩阵
(n\u index1\u行,n\u index2\u行,1)

有没有办法使用
.groupby(…)
然后使用
.values.tolist()
.as_矩阵(…)
来获得所需的形状

编辑:数据

                                                              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")])

我想你想要的是取消多重索引的堆叠,例如

df.unstack().values[:, :, np.newaxis]
编辑:如果您有重复的索引,取消堆叠将不起作用,您可能需要一个
pivot\u表

pivoted = df.reset_index().pivot_table(index='current_date',
                                       columns='temp_date',
                                       aggfunc='mean')
arr = pivoted.values[:, :, np.newaxis]
arr.shape
# (10, 50, 1)
下面是
取消堆栈
的完整示例。首先,我们将创建一些数据:

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)

你想要一个3D阵列吗?或者只是一个二维数组,包括索引和列?三维数组。np.array中的所有值都应该是列值(而不是索引)。请提供一些具有所需输出的示例数据。完成。忽略时髦的DateTimes抱歉,为什么这意味着要成为一个3D阵列?您有两个索引(i=current_date和j=temp_date,可能有一些映射——现在temp_date没有排序,所以不清楚)和这些索引指定的值。这不是2D对象吗?我得到
ValueError:索引包含重复的条目,在尝试取消堆栈时无法重塑。我有很多行,其中一些行具有相同的
temp\u date
(但值不同)。我必须解开数以百万计的索引。有没有办法避免这种情况?重新索引
临时日期
或类似的东西?哦,我不知道你有重复的。在这种情况下,您需要进行某种聚合以获得所需的结果(并且您必须决定哪种聚合适合您的数据)。数据透视表将是一种很好的方法:请参见上面的“我的编辑”。