一个 pandas Series 和单列 DataFrame 的区别是什么?

243
为什么pandas区分Series和单列DataFrame?换句话说,Series类的存在有什么原因?
我主要使用具有日期时间索引的时间序列,也许这有助于设置上下文。

显然它们是不同的,我想你指的是某些操作仍会返回一个数据框,因为你只有一个单列数据框或者该操作结果为单列数据框。但是当选择单列时就没有歧义了,这将分解为一个系列。您必须展示样本代码来解释您的问题所在。 - EdChum
10
主要问题在于我不认为需要一个具有不同方法的Series对象。 - saroele
首先,有一个命名空间的差异。Series只有一个顶级名称,而数据框具有顶级和列名称。这可能会导致在处理/创建新系列与新列时语法上的显着差异。 - JohnE
7
据我所知,这个问题应该仍然需要回答。虽然可以将 DataFrame 看作是一组 Seriesdict(尽管当前实现不是这样),但仍不清楚为什么会返回一个 Series 对象,而不是一个 DataFrame(也就是概念上只有一个条目的 dict)。 - Alex
@Alex在2018年的评论在我看来仍然很有参考价值。 - rsmith54
1
@EdChum,那不是真的。考虑dataframe.loc [:,string]与dataframe.loc [:,[string]]:在任一情况下选择一个列,但返回的类型分别为Series和DataFrame。 - Antonio Sesto
6个回答

265

引用Pandas文档的话:

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

二维大小可变、可能异构的带标签轴(行和列)的表格数据结构。算术运算在行和列标签上对齐。可以被视为Series对象的类似字典的容器。主要的pandas数据结构。

因此,Series是DataFrame的单个列的数据结构,不仅在概念上如此,而且从字面上来说,即DataFrame中的数据实际上存储在内存中作为一组Series

类比地说:我们需要列表和矩阵,因为矩阵是由列表构建的。单行矩阵虽然在功能上等同于列表,但如果没有它们所组成的列表,就无法存在。

他们两者的API非常相似,但你会发现DataFrame方法总是考虑到你可能有多列数据。当然,你可以随时将另一个Series(或等效对象)添加到DataFrame中,而将Series添加到另一个Series则需要创建DataFrame。

3
感谢您的回答。我的问题源于代码中的一个错误,当我选择一个DataFrame时,却突然返回了一个Series,而我无法访问该列属性。我并不是唯一困惑的人:https://dev59.com/0GQn5IYBdhLWcg3wgnTg?lq=1 - saroele
12
从“可以被视为包含一系列Series对象的类似字典的容器”这句话中,你无法推断出DataFrame实际内部数据结构的任何信息。事实上,它当前存储为一个BlockManager(这是一些实现细节,你不应该依赖它)。 - Tim Diels
21
我可能有点迂腐,但我认为原帖中的问题“为什么要使用Series”并没有得到解答。我看到一个回答描述了Series与DataFrames之间的关系,但没有解释为什么我们要将Series作为单独的数据类型,而不是作为DataFrame的一个特例(即只有一列的DataFrame)。 - MightyCurious
4
为什么有时候会使用Series而不是DataFrame呢? - Gulzar
2
在我看来,这表明Series是一个不完美的抽象,并且认为Series不应该暴露给用户。相反,单列数据框更加有用。 - rsmith54
显示剩余4条评论

15

来自Pandas文档http://pandas.pydata.org/pandas-docs/stable/dsintro.html Series是一维带标签的数组,能够保存任何数据类型。 读取Pandas Series格式的数据:

import pandas as pd
ds = pd.Series(data, index=index)

DataFrame是一种2维带标签的数据结构,其中每个列可能具有不同的数据类型。

import pandas as pd
df = pd.DataFrame(data, index=index)

在以上两个示例中,索引都是列表。
例如:我有一个包含以下数据的 CSV 文件:
,country,popuplation,area,capital
BR,Brazil,10210,12015,Brasile
RU,Russia,1025,457,Moscow
IN,India,10458,457787,New Delhi

要将上述数据读取为系列(Series)和数据框(DataFrame):

import pandas as pd
file_data = pd.read_csv("file_path", index_col=0)
d = pd.Series(file_data.country, index=['BR','RU','IN'] or index =  file_data.index)

输出:

>>> d
BR           Brazil
RU           Russia
IN            India

df = pd.DataFrame(file_data.area, index=['BR','RU','IN'] or index = file_data.index )

输出:

>>> df
      area
BR   12015
RU     457
IN  457787

2
我没有给你的代码点踩,但是它并不能正常工作。你可能需要将 file_data 改为 brics,在 csv 中添加一行美国数据,并将 ['BR'....'US'] 改为 brics.index。也许需要修正 pupuplation 拼写错误。 - RolfBly
@RolfBly:感谢您指出那些错误。我犯了傻瓜式的错误。我已经更正了它们。谢谢!关于阅读,那只是我随机取的一个例子。 - Umesh Kaushik

3

Series是一种一维标记数组,能够容纳任何数据类型(整数、字符串、浮点数、Python对象等)。轴标签被统称为索引。创建Series的基本方法是调用:

s = pd.Series(data, index=index)

DataFrame是一个二维的带有标签的数据结构,它的列可能包含不同类型的数据。你可以将它看作是电子表格或SQL表,或者是一组Series对象的字典。

 d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
 two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
 df = pd.DataFrame(d)

3

Series是一个一维对象,可以存储任何数据类型,例如整数、浮点数和字符串,如下所示:

   import pandas as pd
   x = pd.Series([A,B,C]) 

0 A
1 B
2 C

Series 的第一列称为索引,即 0、1、2,而第二列是实际数据,即 A、B、C。

DataFrames 是一个二维对象,可以容纳 Series、列表、字典等。

df=pd.DataFrame(rd(5,4),['A','B','C','D','E'],['W','X','Y','Z'])

这并没有回答提问者的问题。 - braaterAfrikaaner

0

DataFrame通常被描述为一个二维带标签的数据结构,其中列可能具有不同的类型。您可以将其视为电子表格或SQL表。

由于这个定义,我们可以像在Excel电子表格中一样将数据看作单元格,其中行具有行号,列具有列标题。由于这种简单的视图,底层数据结构可能会有些令人惊讶。

DataFrame实际上由轴标签(行和列标签)的Index对象和列数据的Series对象组成。

Series对象为每个列数据提供了封装(它们保存在一维numpy.ndarray中),包括行标签和列标签。

因此,单列DataFrame将具有一个基础Series对象,用于列数据。

请参见DataFrame数据结构,其中包含一个简单示例和底层数据结构的可视化表示。


-1
导入汽车数据
import pandas as pd

cars = pd.read_csv('cars.csv', index_col = 0)

这是cars.csv文件的外观。

将drives_right列作为Series打印出来:

print(cars.loc[:,"drives_right"])

    US      True
    AUS    False
    JAP    False
    IN     False
    RU      True
    MOR     True
    EG      True
    Name: drives_right, dtype: bool

单括号版本返回一个Pandas Series,双括号版本返回一个Pandas DataFrame。

将drives_right列作为DataFrame打印出来。

print(cars.loc[:,["drives_right"]])

         drives_right
    US           True
    AUS         False
    JAP         False
    IN          False
    RU           True
    MOR          True
    EG           True

将一个Series添加到另一个Series会创建一个DataFrame。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接