Pandas常用的数据结构有两大类:series序列
和data frame数据帧
。由于panel面板
被弃用,在这里,我们就不进行介绍了。其实panel
是三维数据比较好用的数据容器。这篇文章将介绍Series
数据类型。
Series 序列
创建序列
import pandas as pd
import numpy as np
s = pd.Series(data, index=index)
这里的data
可以是Python字典,numpy的ndarray,也可以是一个实数。
从ndarray建立
In [3]: s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
In [4]: s
Out[4]:
a 0.4691
b -0.2829
c -1.5091
d -1.1356
e 1.2121
dtype: float64
In [5]: s.index
Out[5]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
In [6]: pd.Series(np.random.randn(5))
Out[6]:
0 -0.1732
1 0.1192
2 -1.0442
3 -0.8618
4 -2.1046
dtype: float64
注意:pandas支持非唯一索引值。
从字典建立
In [7]: d = {'b' : 1, 'a' : 0, 'c' : 2}
In [8]: pd.Series(d)
Out[8]:
b 1
a 0
c 2
dtype: int64
当数据是dict,并且未传递索引时,如果您使用的是Python版本> = 3.6且Pandas版本> = 0.23,则系列索引将按dict的插入顺序排序。
如果您使用的是Python < 3.6或Pandas < 0.23,并且未传递索引,则Series索引将是词汇顺序的dict键列表。
在上面的示例中,如果您使用的Python版本低于3.6或Pandas版本低于0.23,则系列将按字典键的词法顺序排序(即[‘a’,‘b’,‘c’ 而不是[‘b’,‘a’,‘c’])。
In [9]: d = {'a' : 0., 'b' : 1., 'c' : 2.}
In [10]: pd.Series(d)
Out[10]:
a 0.0
b 1.0
c 2.0
dtype: float64
In [11]: pd.Series(d, index=['b', 'c', 'd', 'a'])
Out[11]:
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
注意:NaN在pandas中只是一个缺省值的标志。与None不是一回事,与nul也不是一回事。
从实数构建
一个实数对应多个索引,则每个索引对应的值都是这个实数。
In [12]: pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
Out[12]:
a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
我们可以像操作dict和ndarray一样操作Series
比如我们可以用ndarray的切片方法
In [13]: s[0]
Out[13]: 0.46911229990718628
In [14]: s[:3]
Out[14]:
a 0.4691
b -0.2829
c -1.5091
dtype: float64
In [15]: s[s > s.median()]
Out[15]:
a 0.4691
e 1.2121
dtype: float64
In [16]: s[[4, 3, 1]]
Out[16]:
e 1.2121
d -1.1356
b -0.2829
dtype: float64
In [17]: np.exp(s)
Out[17]:
a 1.5986
b 0.7536
c 0.2211
d 0.3212
e 3.3606
dtype: float64
再比如我们用dict的索引方法
In [18]: s['a']
Out[18]: 0.46911229990718628
In [19]: s['e'] = 12.
In [20]: s
Out[20]:
a 0.4691
b -0.2829
c -1.5091
d -1.1356
e 12.0000
dtype: float64
In [21]: 'e' in s
Out[21]: True
In [22]: 'f' in s
Out[22]: False
如果某个列标签不存在,则会返回一个错误提示keyError
.
如果使用get
方法,缺省值会返回None
或者指定的默认值。
>>> s['f']
KeyError: 'f'
n [23]: s.get('f')
In [24]: s.get('f', np.nan)
Out[24]: nan
序列的向量操作
这种向量化的操作和R语言非常像,都是去操作序列的每个元素的。
In [25]: s + s
Out[25]:
a 0.9382
b -0.5657
c -3.0181
d -2.2713
e 24.0000
dtype: float64
In [26]: s * 2
Out[26]:
a 0.9382
b -0.5657
c -3.0181
d -2.2713
e 24.0000
dtype: float64
In [27]: np.exp(s)
Out[27]:
a 1.5986
b 0.7536
c 0.2211
d 0.3212
e 162754.7914
dtype: float64
Series和ndarray之间的主要区别在于Series之间的操作会根据标签自动对齐数据。因此,您可以在不考虑所涉及的系列是否具有相同标签的情况下编写计算。
In [28]: s[1:] + s[:-1]
Out[28]:
a NaN
b -0.5657
c -3.0181
d -2.2713
e NaN
dtype: float64
注意:通常,我们选择使不同索引对象之间的操作的默认结果产生索引的并集,以避免信息丢失。尽管缺少数据,但索引标签通常是重要信息,作为计算的一部分。您当然可以选择通过dropna函数删除缺少数据的标签。
序列的name属性
In [29]: s = pd.Series(np.random.randn(5), name='something')
In [30]: s
Out[30]:
0 -0.4949
1 1.0718
2 0.7216
3 -0.7068
4 -1.0396
Name: something, dtype: float64
In [31]: s.name
Out[31]: 'something'
In [32]: s2 = s.rename("different")
In [33]: s2.name
Out[33]: 'different'
以上内容参考https://www.pypandas.cn/document/dsintro/series.html