重塑熊猫系列?

Posted

技术标签:

【中文标题】重塑熊猫系列?【英文标题】:Reshape of pandas series? 【发布时间】:2013-01-01 15:35:50 【问题描述】:

在我看来,它就像 pandas.Series 中的一个错误。

a = pd.Series([1,2,3,4])
b = a.reshape(2,2)
b

b 有类型 Series 但无法显示,最后一条语句给出异常,非常冗长,最后一行是“TypeError: %d format: a number is required, not numpy.ndarray”。 b.shape 返回 (2,2),与其类型 Series 相矛盾。我猜也许 pandas.Series 没有实现重塑功能,我正在从 np.array 调用版本?有人也看到这个错误吗?我在熊猫 0.9.1。

【问题讨论】:

我对 Pandas 不是很熟悉,但我知道它的魅力和局限性在于为不同维度的数组提供专用对象。所以即使后台有numpy,pd.Series总是一维的,pd.DataFrame总是二维的。因此,以您的方式重塑其中一个对象并没有多大意义。 而“做的方式”应该是“做的方式”……真丢脸! 【参考方案1】:

您可以在Series的values数组上调用reshape

In [4]: a.values.reshape(2,2)
Out[4]: 
array([[1, 2],
       [3, 4]], dtype=int64)

我实际上认为将reshape 应用于系列并不总是有意义(您是否忽略索引?),并且您认为它只是 numpy 的重塑是正确的:

a.reshape?Docstring: See numpy.ndarray.reshape

也就是说,我同意让你尝试这样做的事实看起来像一个错误。

【讨论】:

我曾经继承ndarray 来实现一个固定维度的对象。抓住reshapes 并且不允许它们是很诱人的,但是你在 numpy 中喜欢的很多很酷的东西都依赖于改变底层数据的维度,例如摆脱 reshapetile 不再起作用。可能这是在 Pandas 中重用 numpy 引擎的一个很小的、不可避免的代价。 @Jaime 当您尝试执行此操作时它会导致异常肯定是一个错误,它应该让您对 DataFrame(和重新索引)执行此操作,或者该方法不可用? 关键是你不能在不破坏其他功能的情况下让它不可用,除非你愿意重做很多 numpy 免费提供给你的东西。这不好,我同意,但它可能真的是最好的。 @isulsz 我不使用 Pandas,所以我真的不在乎,我不反对改变 Series 的行为,请提交错误报告。但问题是无法从您的对象中访问reshape,而是知道对您的对象的reshape 的调用是否来自用户,这应该得到NotImplemented 异常,或者来自另一个依赖于的numpy 方法reshape 做它的事。在 numpy 中,matrix 应该是一个 2D 对象,但您可以将其重塑为 1D 或 3D,因为如果不是这样,您将无法做到,例如,np.tilematrix【参考方案2】:

reshape 函数将新形状作为一个元组而不是多个参数:

In [4]: a.reshape?
Type:       function
String Form:<function reshape at 0x1023d2578>
File:       /Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition: numpy.reshape(a, newshape, order='C')
Docstring:
Gives a new shape to an array without changing its data.

Parameters
----------
a : array_like
    Array to be reshaped.
newshape : int or tuple of ints
    The new shape should be compatible with the original shape. If
    an integer, then the result will be a 1-D array of that length.
    One shape dimension can be -1. In this case, the value is inferred
    from the length of the array and remaining dimensions.

Reshape实际上是在Series中实现的,会返回一个ndarray:

In [11]: a
Out[11]: 
0    1
1    2
2    3
3    4

In [12]: a.reshape((2, 2))
Out[12]: 
array([[1, 2],
       [3, 4]])

【讨论】:

【参考方案3】:

你可以直接使用a.reshape((2,2))对Series进行reshape,但是不能直接reshape一个pandas DataFrame,因为pandas DataFrame没有reshape功能,但是你可以在numpy ndarray上做reshape:

    将 DataFrame 转换为 numpy ndarray 重塑 转换回来

例如

a = pd.DataFrame([[1,2,3],[4,5,6]])
b = a.as_matrix().reshape(3,2)
a = pd.DataFrame(b)

【讨论】:

【参考方案4】:

只需使用以下代码:

b=a.values.reshape(2,2)

我想它会对你有所帮助。 你只能直接使用 reshape() 函数。但它会给出未来的警告

【讨论】:

请在代码中添加一些解释,因为它有助于理解您的代码。仅代码的答案不受欢迎。【参考方案5】:

例如,我们有一个系列。我们可以这样改成dataframe;

a = pd.DataFrame(a)

【讨论】:

以上是关于重塑熊猫系列?的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫多索引数据框重塑为多列

在熊猫中重塑宽到长

根据列标签重塑熊猫中的数据框

熊猫从长到宽重塑,由两个变量

熊猫通过根据另一列的值添加列级别来重塑数据框[重复]

基于索引从大熊猫系列列表中提取到另一个大熊猫系列