带有 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