【问题标题】:Pandas pd.series returns a data framePandas pd.series 返回一个数据框
【发布时间】:2020-10-24 00:13:46
【问题描述】:

我想问一个关于熊猫系列的问题。

我正在阅读 O'Reilly 出版的关于 Python 的数据科学书籍,并且正在阅读 Pandas。

考虑以下代码:

frame = pd.DataFrame(np.random.randn(4,3), columns=list('bde'),
                index=['Utah', 'Ohio', 'Texas', 'Oregon'])

此代码提供以下结果。

        b        d         e
Utah    -0.81    0.43      -0.50
Ohio    1.67     -0.67     1.30
Texas   0.53     -0.32     0.80
Oregon  0.25     0.91      0.70    

所有值均手动表示为 3 d.p。为方便起见。

现在,我了解到函数也可以返回具有多个值的系列:

def f(x):
    return pd.Series([x.min(), x.max()], index=['min', 'max'])

如文献所述:

许多最常见的数组统计信息(如 sum 和 mean)都是 DataFrame 方法,因此不需要使用 apply。传递给 apply 的函数不需要返回标量值;它还可以返回一个具有多个值的系列。

并运行以下代码

frame.apply(f)

产生以下结果:

        b        d        e
min     -0.82    -0.67    -0.50
max     1.67     0.91     1.30

此代码有效。

但是,我在这里感到困惑。

我认为一个系列应该只是一维的,即伪单列数据结构,只有每个对应元素的索引。

例如

 >>> s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])

 >>> s

a    0.469112
b   -0.282863
c   -1.509059
d   -1.135632
e    1.212112
dtype: float64

但是,函数的结果似乎是一系列二维性质,这对我来说没有意义。

这个函数是如何形成一系列二维性质的?

有趣的是,做

type(frame.applymap(format))

返回

pandas.core.frame.DataFrame

我不知道为什么会这样。

【问题讨论】:

  • 您只是对结果感到困惑。实际上,该函数仅用于查找最大值和最小值,然后将其应用于数据框。 frame.apply(f) 此后返回结果以将其应用于您的数据框,因此仍与 Series 上的数据框相关。
  • 哦,我想我明白了。 @Amin 该函数返回一个系列,但我们仍然将该函数应用于每一列,即axis=0,所以我们在frame.apply(f) 之后的最终结果是一个数据框,即使我们的初始函数首先返回一个series
  • 是的。通过调用该函数('f'),我们只是尝试将我们的方法展示给数据框,然后将其应用到数据框。数据框采用此函数功能并将其应用于所有列。

标签: python pandas dataframe series


【解决方案1】:

Pandas 系列是某种类型的一维数组。 DataFrame 是一个二维数组,其中每一列都是一个系列,它们可以有不同的类型。

但是,您可能缺少的部分是“类型”可以是通用 Python object,它是对任何对象的引用。例如:

pd.Series([[1,2],[3,4]])

给你:

0    [1, 2]
1    [3, 4]
dtype: object

这是 Python 列表的一维数组(甚至不必具有统一的长度)。

在 Pandas(或 NumPy)中使用 object dtype 通常不是最理想的,应尽可能避免。在上面的示例中,您可以将 Series 替换为 DataFrame 以获得更优化的表示。 object dtype 不是最理想的,因为 Pandas 本身并不能理解其中的大部分内容,因此必须使用 Python 解释器对数组中的每个值进行任何操作,而不是像 dtype 那样通过编译代码加速int 或 Pandas 本身可以理解的其他类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2018-11-22
    • 2021-08-23
    • 2021-10-20
    • 2020-09-03
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多