pandas系列和单列DataFrame有什么区别?


168

为何熊猫区分a Series和单栏DataFrame
换句话说:Series该类存在的原因是什么?

我主要使用带有datetime索引的时间序列,也许这有助于设置上下文。


好吧,它们显然是不同的,我认为您是指仍返回数据帧的某些操作,要么是因为您只有单个列数据帧,要么是因为该操作导致了单个列数据帧。但是,选择单个列时不会产生歧义,这会分解为系列。您必须显示示例代码来解释问题所在。
EdChum 2014年


6
主要问题是,我认为不需要使用不同方法的Series对象。
saroele 2014年

首先,存在名称空间差异。系列仅具有顶级名称,数据框具有顶级和列名称。这可能导致处理/创建新系列与新列的语法存在显着差异。
JohnE 2014年

4
据我所知,这个问题仍应回答。尽管可以认为DataFramedictof的Series(尽管不是当前的实现),但仍不清楚为什么您会返回一个Series对象而不是一个对象DataFrame(即,从概念上讲dict,只有一个条目)。
Alex

Answers:


190

引用熊猫文档

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

具有标注轴(行和列)的二维大小可变的,可能是异构的表格数据结构。算术运算在行和列标签上对齐。可以看作是Series对象的类似dict的容器。大熊猫的主要数据结构。

因此,系列是a的单个列的数据结构DataFrame,不仅在概念上,而且从字面上看,即a中的数据DataFrame实际上都作为的集合存储在内存中Series

类似地:我们需要列表和矩阵,因为矩阵是用列表构建的。单行矩阵虽然在功能上等同于列表,但没有它们组成的列表仍然不存在。

它们都具有极其相似的API,但是您会发现DataFrame方法始终可以满足您拥有不止一列的可能性。并且,当然,您总是可以向添加另一个Series(或等效对象)DataFrame,而向添加Series另一个Series涉及创建DataFrame


2
感谢您的回答。我的问题是由我的代码中的一个错误引起的,当时一个数据框上的选择突然返回一个系列,而我无法访问columns属性。我不是唯一的一个困惑:stackoverflow.com/questions/16782323/...
saroele

我懂了。如果他们的__repr__行为不同,这可能会有所帮助,所以您不能将它们混淆?
PythonNut 2014年

6
您无法得出有关DataFramefrom 的实际内部数据结构的任何结论Can be thought of as a dict-like container for Series objects。实际上,它当前存储为BlockManager(这是您不应该依赖的实现细节)。
timdiels 2015年

1
我仍然很困惑,所以什么时候应该使用单列数据框而不是系列数据框?
dhiraj suvarna

4
我可能是个书呆子,但我看不出OP的WHY系列问题是否已得到回答。我看到一个描述序列和数据框之间关系的答案,但没有看到解释为什么我们要把序列作为单独的数据类型而不是数据框的特殊情况(即只有一列的情况)的答案。
MightyCurious

14

来自pandas doc,网址http://pandas.pydata.org/pandas-docs/stable/dsintro.html。Series是一维标记的数组,能够保存任何数据类型。以熊猫系列的形式读取数据:

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

DataFrame是二维标记的数据结构,具有可能不同类型的列。

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

要读取以上数据作为序列和数据框:

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
如果有人努力拒绝投票,您还可以尝试提及一个原因吗?
Umesh Kaushik

2
我没有投票,但是您的代码无效。您可能需要更改file_databrics,在csv中添加一条美国线,然后更改['BR'....'US']brics.index。也许是正确的pupuplation
RolfBly

@RolfBly:感谢您指出这些错误。制造它们对我来说很愚蠢。我已经改变了。谢谢!关于阅读这只是一个例子,因此我采用了随机值。
Umesh Kaushik

4

系列是一维对象,可以保存任何数据类型,例如整数,浮点数和字符串,例如

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

0 A
1 B
2 C

系列的第一列称为索引,即0,1,2,第二列是您的实际数据,即A,B,C

DataFrames是二维对象,可以容纳序列,列表,字典

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

2

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

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)

0

导入汽车数据

import pandas as pd

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

这是cars.csv文件的外观。

打印出drive_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系列,双括号版本提供Pandas DataFrame。

打印出drive_right列作为DataFrame

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

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

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


1
非常感谢您的编辑。现在看起来好多了。@Zoe
abhishek_7081
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.