天天看点

Pandas基本数据结构之Series简介

Pandas,Numpy和Matplotlib并称数据分析三剑客, Pandas是一款开源的,具有BSD协议许可,基于Numpy开发的用于数据分析的python工具包,Pandas提供了两种基本的数据结构,分别是Series(一维数据)和DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。处理数据一般分为几个阶段:数据整理与清洗、数据分析与建模、数据可视化与报表,而Pandas 是处理数据的理想工具,并且具有较高的性能和较广泛的应用。本文主要简单介绍一下Pandas的两种基本的数据结构,包括基于这两类数据结构的数据类型、索引、对齐等操作。

类型 维数 描述
Series 1 带标签的一维同构数组
DataFrame 2 带标签的,大小可变的,二维异构表格

Series

  Series是带index的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引。调用 pd.Series 函数即可创建 Series,pandas支持从以下集中数据类型创建Series:

  • python数组
  • Python字典
  • 标量

pandas创建Series的基本范式为:

s = pandas.Series(data,s = pandas.Series( data, index, dtype, copy)           

参数说明如下:

参数 描述
data 输入的数据,可以是列表、常量、ndarray 数组等。
index 索引值必须是惟一的,如果没有传递索引,则默认为 np.arrange(n)。
dtype dtype表示数据类型,如果没有提供,则会自动判断得出。
copy 表示对 data 进行拷贝,默认为 False。

下面分别介绍使用不同的数据类型进行Series的创建。

使用字典创建Series

  data 为字典,且未设置 index 参数时,Series 按字典的插入顺序排序索引,不会将字典中的key进行重新排序。如果设置了 index 参数,则按索引标签提取 data 里对应的值。如果index对应的key在字典中不存在,则当前索引对应的值设为默认值NaN。

In [28]:
#使用python字典创建Series
d = {'a': 1, 'c': 2, 'b': 3}
s = pd.Series(d)
s
Out[28]:
a    1
c    2
b    3
dtype: int64

In [29]:
 #如果index中指定了字典中不存在的index,则默认值为NaN(Not a Number)
s = pd.Series(d, index=['a','b','c','d'])
s
Out[29]:
a    1.0
b    2.0
c    3.0
d    NaN
dtype: float64

           

使用多维数组创建Series

  data 是多维数组时,index的长度必须与 data 长度一致。若不指定 index 参数,则默认创建数值型索引,即 [0, ..., len(data) - 1]。这里需要注意的是:pandas中的索引是可以重复的。

In [30]:
#使用python数组创建Series,采用默认索引
d = np.random.randn(5)
s = pd.Series(d)
s
Out[30]:
0    0.770792
1    0.089687
2   -0.986884
3    0.462016
4    0.024762
dtype: float64

In [32]:
d = np.random.randn(5)
s = pd.Series(d, index = ['a','b','c','d','e'])
s
#使用numpy数组创建Series,并指定索引
d = np.random.randn(5)
s = pd.Series(d, index = ['a','b','c','d','e'])
s
Out[32]:
a   -0.427226
b    0.624971
c    0.868915
d   -0.415884
e   -0.927602
dtype: float64

In [54]:
#使用numpy数组创建Series,并指定重复索引
d = np.random.randn(5)
s = pd.Series(d, index = ['a','a','c','c','e'])
s
Out[54]:
a   -0.639554
a    0.898147
c   -1.234120
c   -0.300080
e   -0.918032
dtype: float64

           

使用标量创建Series

  data 是标量值时,Series 按索引长度重复该标量值。若不提供索引,则默认创建一个长度为1索引为0的Series。

In [33]:
#使用标量创建Series,并指定索引
s = pd.Series(6, index = ['a','b','c','d','e'])
s
Out[33]:
a    6
b    6
c    6
d    6
e    6
dtype: int64

In [35]:
#使用标量创建Series,不指定索引
s = pd.Series(6)
s
Out[35]:
0    6
dtype: int64
           

操作Series

  Series的操作与Numpy中的ndarray类似,支持大多数的numpy函数,还支持索引切片及矢量对齐

In [37]: 
d = np.random.randn(5)
s = pd.Series(d, index = ['a','b','c','d','e'])
s
Out[37]:
a    0.419126
b    1.343213
c   -1.712911
d    0.045794
e    0.215026
dtype: float64

In [38]: s[0]
Out[38]:
0.4191260001574275
In [39]: s[1:3]
Out[39]:
b    1.343213
c   -1.712911
dtype: float64

In [40]: s[s > s.median()]
Out[40]:
a    0.419126
b    1.343213
dtype: float64

In [41]: s[[4,2,1]]
Out[41]:
e    0.215026
c   -1.712911
b    1.343213
dtype: float64

In [42]: s ** 2
Out[42]:
a    0.175667
b    1.804222
c    2.934065
d    0.002097
e    0.046236
dtype: float64

In [44]: s + 3
Out[44]:
a    3.419126
b    4.343213
c    1.287089
d    3.045794
e    3.215026
dtype: float64

In [45]: np.exp(s)
Out[45]:
a    1.520632
b    3.831335
c    0.180340
d    1.046858
e    1.239894
dtype: float64

In [55]: s.to_numpy()
Out[55]: 
array([-0.63955367,  0.89814701, -1.23412005, -0.30008022, -0.91803156])           

  另外,Series还支持类似字典的操作。

In [58]:
d = np.random.randn(5)
s = pd.Series(d, index = ['a','b','c','d','e'])
s
Out[58]:
a    0.253800
b    1.789636
c   -0.160213
d    0.003032
e    0.750664
dtype: float64

In [60]: s['c']
Out[60]: -0.1602127079954173

In [61]: s['f']
--------------------------------------
KeyError: 'f'

In [62]: s.get('a')
Out[62]: 0.2538004105637758

In [64]: s.get('f', -1)
Out[64]: -1

In [65]: 'a' in s
Out[65]:True

In [66]: 'f' in s
Out[66]: False           

  另外,虽然Series支持类似字典的操作,但是由于Series中是允许存在重复key的,因此对重复的index对应的data进行操作时,该操作会应用到当前index所对应的所有data上。

In [67]:
d = np.random.randn(5)
s = pd.Series(d, index = ['a','a','a','d','d'])
s
Out[67]:
a    0.309839
a   -0.109097
a    0.264681
d    0.170363
d   -0.185495
dtype: float64

In [68]: s['a']
Out[68]:
a    0.309839
a   -0.109097
a    0.264681
dtype: float64
In [69]: s['a'] = 3.14

In [70]: s
Out[70]:
a    3.140000
a    3.140000
a    3.140000
d    0.170363
d   -0.185495
dtype: float64
           

  另外,pandas还提供了基于Series的聚合操作,场景的聚合操作行数有groupby、sum、mean等等。

In [76]:
s
Out[76]:
a    3.140000
a    3.140000
a    3.140000
d    0.170363
d   -0.185495
dtype: float64
In [77]:
s.mean()
Out[77]:
1.880973656599894
In [78]:
s.sum()
Out[78]:
9.40486828299947
In [79]:
s.groupby(s.index).mean()
Out[79]:
a    3.140000
d   -0.007566
dtype: float64
In [80]:
s.groupby(s.index).sum()
Out[80]:
a    9.420000
d   -0.015132
dtype: float64
In [81]:
s.groupby(level=0).sum()
Out[81]:
a    9.420000
d   -0.015132
dtype: float64
In [83]:
s.groupby(['1','0','1','0','1']).sum()
Out[83]:
0    3.310363
1    6.094505
dtype: float64
           

  OK,关于Series就先简单介绍这么多,后面有时间会简单介绍以下DataFrame相关的东西。

继续阅读