Pandas之Series
Series是指一个类似于数组、列表或列变量的一维对象。
Series中每个条目都会被分配一个标签索引。默认情况下,每个条目都会收到一个从0到N之间的索引标签,其中N等于Series的长度减一。
Series可以理解为一个一维的数组,只是index可以自己改动。创建的方法统一为pd.Series(data,index=)。打印的时候按照index赋值的顺序,有的时候会看着很别扭。某个index对应的值为空就用NaN。
index参数默认从0开始的整数,也是Series的绝对位置,即使index被赋值之后,绝对位置不会被覆盖。
Series可以通过三种形式创建:python的dict、numpy当中的ndarray(numpy中的基本数据结构)、具体某个数值。index赋值必须是list类型。
Seriers的交互式显示的字符串表示形式是索引在左边,值在右边。【因为我们没有给数据指定索引,一个包含整数0到N-1(这里N是数据的长度)的默认索引被创建】。 你可以分别的通过它的values和index属性来获取Series的数组表示和索引对象。
- [ ] 简而言之,Seriers是一个用values表示数值,index表示索引的一维数据结构。
序列的创建主要有三种方式:
1)通过一维数组创建序列
Series 是一个值的序列,它只有一个列,以及索引。下面的例子中,就用默认的整数索引
import numpy as np, pandas as pd
arr1 = np.arange(10)
print(arr1)
type(arr1)
s1 = pd.Series(arr1)
print('\n')
print(s1)
type(s1)
输出:
[0 1 2 3 4 5 6 7 8 9]
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int64
Out[8]:
pandas.core.series.Series
如果要手动赋值index的话,index赋值必须是list类型
t = pd.Series(np.random.randn(5), index = list('ABCDE'))
print(t)
输出:
A 1.057772
B 0.062996
C 0.325803
D -0.141765
E 0.140319
dtype: float64
注意:创建Series的时候要注意创建行数和索引数量匹配的问题,如果默认的话会自动匹配创建的行数,但是values和index在不匹配的情况根据不同的情况,pandas做不同的处理。
下述创建报错:原因是values和index不匹配,在以及固定了values和index的情况加,pandas无法通过自动调整来进行匹配
s=pd.Series([5,4],index=list('abcd'))
print(s)
输出:
~/local/anaconda3/lib/python3.6/site-packages/pandas/core/internals.py in __init__
(self, values, placement, ndim, fastpath)
113 raise ValueError('Wrong number of items passed %d, placement '
114 'implies %d' % (len(self.values),
--> 115 len(self.mgr_locs)))
116
117 @property
ValueError: Wrong number of items passed 2, placement implies 4
如果将上述创建调整,通过:
s=pd.Series([5,4],index=list('ab'))
print(s)
输出如下:
a 5
b 4
dtype: int64
下述创建pandas会自动调整,不会报错:
t=pd.Series(5,index=list('abcd'))
print(t)
t=pd.Series(5,index=list('ab'))
print('\n')
print(t)
输出:
a 5
b 5
c 5
d 5
dtype: int64
a 5
b 5
dtype: int64
像这种保证每行数据精准性的话很麻烦,并且用起来会不小心把其他数据覆盖掉,因此建议少用,除非明确知道values和index的对应情况,否则易导致程序出错。
2)通过字典的方式创建序列
Series可以直接转换词典格式的数据,其中词典的键值对应Series中的索引值。
dic1 = {'a':10,'b':20,'c':30,'d':40,'e':50}
type(dic1)
s2 = pd.Series(dic1)
print(s2)
type(s2)
#覆盖字典的键值,如果键对应的值是空的话,则用NaN来填充。
s= pd.Series({'a':1,'b':2,'d':3},index = ['a','d','c','b'])
print(s)
输出:
a 10
b 20
c 30
d 40
e 50
dtype: int64
a 1.0
d 3.0
c NaN
b 2.0
dtype: float64
3)通过DataFrame中的某一行或某一列创建序列
这部分内容我们放在后面讲,因为下面就开始将DataFrame的创建。
思考问题:Series的键值是否可以重复?
t = pd.Series(np.random.randn(6), index = list('AABCDE'))
print(t)
输出如下:
A 0.300580
A 2.159469
B 0.138579
C -1.696126
D 0.574021
E -0.400556
dtype: float64
上述的实验是正确的,也就表明Series的index是可以相同的,这和java、C等语言结构中key的概念是不一样的。