python中的series的结构_笔记:Python之Pandas的数据结构-Series

Pandas简介

pandas是数据分析核心工具包。基于Numpy构建,为数据分析而存在。一维数组Series+二维数组Dataframe,可直接读取数据并作处理,效率高使用简单。兼容各种数据库,支持各种分析算法。

Series和Dataframe都是pandas的数据结构。

Series相关知识点总结

Series的相关知识点总结表.png

(1)Series的基本特征

import numpy as np

import pandas as pd

# 导入numpy、pandas

s=pd.Series(np.random.rand(10))

print(s,type(s))

print('------------')

# 查看数据与数据类型

# 输出结果看s是pandas的series

# 用.index查看Series的index

# Series的index的类型是rangeindex,是一个视图

print(s.index,type(s.index))

print('---------')

# 用.values查看Series的values

# Series的values的类型是ndarray,是一个一维数组

print(s.values,type(s.values))

输出结果:

0    0.060467

1    0.040170

2    0.473326

3    0.610087

4    0.156201

5    0.257343

6    0.187864

7    0.582866

8    0.690709

9    0.630344

dtype: float64

------------

RangeIndex(start=0, stop=10, step=1)

# index表示从0开始10结束,步长为1

---------

[ 0.06046737  0.04017007  0.47332572  0.61008698  0.15620063  0.25734266

0.18786369  0.58286576  0.69070927  0.63034371]

(2)Series的创建方法

创建Series用到 pd.Series() ,一共有3种创建Series的方法。

--->>> 方法1:通过dict字典,用pd.Series 创建Series;字典的key就是index,values就是values

# Series的创建,方法一

# 通过dict字典,用pd.Series() 创建Series

# 字典的key就是index,values就是values

dic1={'a':1,'b':2,'c':3,'d':4}

s1=pd.Series(dic1)

print(s1)

dic2={'a':10,'b':{'c':100,'d':200,'e':300},'f':20}

s2=pd.Series(dic2)

print(s2)

输出结果:

a    1

b    2

c    3

d    4

dtype: int64

a                                10

b    {'e': 300, 'c': 100, 'd': 200}

f                                20

dtype: object

--->>> 方法2:通过一维数组,用pd.Series 创建Series

# Series的创建,方法二

# 通过一维数组,用pd.Series() 创建Series

ar=np.random.rand(5)

print(ar,ar.shape)

# 创建ar一维数组

s=pd.Series(ar,index=['a','b','c','e','f'],dtype=np.object)

print(s,type(s),s.dtype)

# Series的index默认从0开始,步长为1

# index参数:设置index,长度保持一致

# dtype参数:设置数值类

输出结果:

[ 0.2012631   0.1001891   0.97043809  0.98347688  0.99686837] (5,)

a    0.201263

b    0.100189

c    0.970438

e    0.983477

f    0.996868

dtype: object object

--->>> 方法3:通过标量创建,用pd.Series 创建Series

# Series的创建,方法三

# 通过标量创建,用pd.Series() 创建Series

s=pd.Series(12,index=range(5))

print(s)

#如果data是标量值,则必须提供索引。该标量值会重复,来匹配索引的长度

输出结果:

0    12

1    12

2    12

3    12

4    12

dtype: int64

(3)Series的名称属性

Series数组的名称创建、用.name输出名称;Series数组名称的重命名,用.rename()

# 创建一个Series,设置name参数创建数组名称

# name为Series的一个参数,创建一个数组的名称

s1=pd.Series(np.random.rand(5),name='aaa')

print(s1)

s2=pd.Series(np.random.rand(5))

print(s2)

print(s1.name,s2.name)

# s1是有创建数组名称的,输出为aaa;

# s2没有创建数组名称的,输出为None

print('-------')

print(s1.rename('bbb'))

print(s1.name)

# s1.rename()将s1原名aaa改为bbb

# 输出s1.name的名字,返回仍旧为aaa

# 说明.rename()重命名一个数组的名称,是会指向一个新数组,且新数组与原数组一样,但原数组名称不变

输出结果:

0    0.780331

1    0.297437

2    0.238227

3    0.363761

4    0.447678

Name: aaa, dtype: float64

0    0.023001

1    0.089099

2    0.797804

3    0.060008

4    0.796604

dtype: float64

aaa None

-------

0    0.780331

1    0.297437

2    0.238227

3    0.363761

4    0.447678

Name: bbb, dtype: float64

aaa

(4)Series的索引与切片

--->>> Series的标索引

# 【下标索引,与序列类似】

s=pd.Series(np.random.rand(5),index=list('abcde'))

print(s)

print('-------')

print(s[0]) # 定位索引为0的值

print(s[0].dtype) # 输出结果float的浮点型

print(type(s[0])) # 输出结果是numpy的浮点型

#print(s[-1])是错误语法,所以Series的下标索引与序列的下标索引也不完全相同

输出结果:

a    0.491990

b    0.092502

c    0.621547

d    0.222271

e    0.430568

dtype: float64

-------

0.491989880552

float64

--->>> Series的标签(index)索引

#【标签(index)索引】

# 类似下标索引,用[]表示,内写上index,注意index是字符串

s=pd.Series(np.random.rand(6),index=list('abcdef'))

print(s)

# 定位单个值的标签索引写法:

# 定位index为b的值

print(s['b'])

print('--------')

# 定位多个值的标签索引写法:

# 需要选择多个标签的值,用[[]]来表示(相当于[]中包含一个列表)

# 多标签索引的结果是新的数组

print(s[['b','d','f']])

输出结果:

a    0.325852

b    0.280335

c    0.374167

d    0.579232

e    0.660827

f    0.150477

dtype: float64

0.280335497476

--------

b    0.280335

d    0.579232

f    0.150477

dtype: float64

--->>> Series的切片

若Series的标签index一开始是数字,不是字符串,那么默认s[索引]先使用的是下标索引;若Series有明确的标签非数字,那就使用标签index索引

s1=pd.Series(np.random.rand(5))

s2=pd.Series(np.random.rand(5),index=list('abcde'))

print(s1)

print(s2)

print(s1[0:2])

# s1的index为默认数字,因此切片索引默认先使用下标索引

# 下标索引做切片,末端不包含

# 下标索引做切片的写法与list类似

print(s1[:4])

print(s1[1:-1])

print(s1[::2])

print(s2['a':'c'])

# s2的index为重新赋给

# 标签index索引做切片,末端包

输出结果:

0    0.279647

1    0.470918

2    0.424850

3    0.387155

4    0.696179

dtype: float64

a    0.607845

b    0.304126

c    0.170116

d    0.064967

e    0.836235

dtype: float64

0    0.279647

1    0.470918

dtype: float64

0    0.279647

1    0.470918

2    0.424850

3    0.387155

dtype: float64

1    0.470918

2    0.424850

3    0.387155

dtype: float64

0    0.279647

2    0.424850

4    0.696179

dtype: float64

a    0.607845

b    0.304126

c    0.170116

dtype: float64

--->>> Series的布尔型索引

对数组做判断之后,返回的是一个由布尔值组成的新的数组

布尔型索引方法:用[判断条件]表示,其中判断条件可以是一个语句,或者是一个布尔型数组

s=pd.Series(np.random.rand(5))

s[4]=np.nan

# 索引为4的值赋予空值

# 空值表示:np.nan/None代表空值/NaN代表有问题的数值(NaN最后会被识别为空值)

print(s)

print(s<0.5)

# 判断s中是否有小于0.5的,输出结果为bool

print(s.isnull())

# 判断s中是否有空值,空值返回真,非空值返回假,输出结果为bool

print(s.notnull())

# 判断s中是否有非空值,非空值返回真,空值返回假

# 对数组做判断之后,返回的是一个由布尔值组成的新的数组

输出结果:

0    0.282185

1    0.959061

2    0.279785

3    0.067625

4         NaN

dtype: float64

0     True

1    False

2     True

3     True

4    False

dtype: bool

0    False

1    False

2    False

3    False

4     True

dtype: bool

0     True

1     True

2     True

3     True

4    False

dtype: bool

(5)Series的基本技巧

--->>> 用.head()和.tail(),查看头部和尾部数据,均默认查看5条

# 查看Series数组的数据

s=pd.Series(np.random.rand(8))

print(s)

print('----------')

print(s.head())

print(s.head(3))

# .head() 默认查看前5条数据

# s.head(3)表示查看前3条数据

print(s.tail())

print(s.tail(4))

# s.tail()默认查看尾部后5条数据

# s.tail(4)表示查看尾部后4条数据

--->>> 用.reindex(),重新索引series,根据新索引顺序重新排序,且会生成新的数组,原数组不受任何影响

s=pd.Series(np.random.rand(5),index=list('abcde'))

print(s)

s1=s.reindex(list('bceafg'))

print(s1)

print(s)

# 用.reindex()重新索引series,根据新索引顺序重新排序

# .reindex()中也是写列表

# 重新索引中的f、g原来没有对应的值,因此在新数组中引入缺失值NaN填充

s2=s.reindex(list('acef'),fill_value=100)

print(s2)

# fill_value参数:为缺失的值填充指定值

输出结果:

a    0.689542

b    0.735547

c    0.255595

d    0.447040

e    0.718980

dtype: float64

b    0.735547

c    0.255595

e    0.718980

a    0.689542

f         NaN

g         NaN

dtype: float64

a    0.689542

b    0.735547

c    0.255595

d    0.447040

e    0.718980

dtype: float64

a      0.689542

c      0.255595

e      0.718980

f    100.000000

dtype: float64

--->>> Series数组的对齐

# Series对齐

s1 = pd.Series(np.random.rand(3), index = ['Jack','Marry','Tom'])

s2 = pd.Series(np.random.rand(3), index = ['Wang','Jack','Marry'])

print(s1)

print(s2)

print('--------')

print(s1+s2)

# Series 和 ndarray 之间的主要区别是,Series 上的操作会根据标签自动对齐

# index顺序不会影响数值计算,Series会以标签对齐来计算

# 空值和任何值计算结果扔为空值

输出结果:

Jack     0.753732

Marry    0.180223

Tom      0.283704

dtype: float64

Wang     0.309128

Jack     0.533997

Marry    0.626126

dtype: float64

Jack     1.287729

Marry    0.806349

Tom           NaN

Wang          NaN

dtype: float64

--->>> 用.drop,删除series数组的元素

# 用.drop,删除series数组的元素

# .drop删除元素不影响原数组,属于复制一个相同副本然后删除,这时参数inplace默认为False

# 若参数inplace默认为True,则删除原数组的元素,没有副本生成

s = pd.Series(np.random.rand(5), index = list('ngjur'))

print(s)

print('--------')

s1=s.drop('n')

s2=s.drop(['j','r'])

s3=s.drop('g',inplace=True)

print(s1)

print('--------')

print(s2)

print('--------')

print(s3)

print('--------')

print(s)

输出结果:

n    0.425891

g    0.341889

j    0.859872

u    0.028564

r    0.214625

dtype: float64

--------

g    0.341889

j    0.859872

u    0.028564

r    0.214625

dtype: float64

--------

n    0.425891

g    0.341889

u    0.028564

dtype: float64

--------

None

--------

n    0.425891

j    0.859872

u    0.028564

r    0.214625

dtype: float64

#s3删除g的值,因inplace=True没有副本生成,且在原数组删除g的值,所以s3=None不存在

#返回的s没有了g的值,因为s3=s.drop('g',inplace=True),在原数组中删除了g的值

--->>> 给Series数组添加元素/数组

# 给Series数组添加元素/数组

# 【添加元素:直接通过下标索引/标签index添加值】

s1 = pd.Series(np.random.rand(5))

s2 = pd.Series(np.random.rand(5), index = list('ngjur'))

print(s1)

print(s2)

s1[5]=100

s2['e']=120

print(s1)

print(s2)

print('--------------------')

# 【添加数组,用.append()】

# 通过.append方法,直接添加一个数组

# .append方法生成一个新的数组,不改变之前的数组

s3=s1.append(s2)

# 将s2数组添加到s1数组中

# 生成了新的数组,所以s1数组没有改变

print(s3)

print(s1)

输出结果:

0    0.919861

1    0.271166

2    0.459674

3    0.373606

4    0.838353

dtype: float64

n    0.179374

g    0.866121

j    0.714827

u    0.520926

r    0.808706

dtype: float64

0      0.919861

1      0.271166

2      0.459674

3      0.373606

4      0.838353

5    100.000000

dtype: float64

n      0.179374

g      0.866121

j      0.714827

u      0.520926

r      0.808706

e    120.000000

dtype: float64

--------------------

0      0.919861

1      0.271166

2      0.459674

3      0.373606

4      0.838353

5    100.000000

n      0.179374

g      0.866121

j      0.714827

u      0.520926

r      0.808706

e    120.000000

dtype: float64

0      0.919861

1      0.271166

2      0.459674

3      0.373606

4      0.838353

5    100.000000

dtype: float64

--->>> 修改Series数组的元素

# 修改Series数组的元素

s = pd.Series(np.random.rand(3), index = ['a','b','c'])

print(s)

s['a'] = 100

s[['b','c']] = 200

print(s)

# 通过索引直接修改,类似序列

输出结果:

a    0.715710

b    0.421069

c    0.571367

dtype: float64

a    100.0

b    200.0

c    200.0

dtype: float64

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值