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相关的东西。