美文网首页
Python pandas之series、DataFrame入门

Python pandas之series、DataFrame入门

作者: lackychen | 来源:发表于2021-01-09 23:26 被阅读0次

Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。利用Pandas进行数据操作、预处理、清洗是Python数据分析中的重要技能。
数据被分为三部分:行索引(index),列索引(columns)及数据内容(data)

Series

Series是Pandas中最基本的对象,Series类似一种一维数组。事实上,Series 基本上就是基于 NumPy 的数组对象来的。和 NumPy 的数组不同,Series 能为数据自定义标签,也就是索引(index),然后通过索引来访问数组中的数据。

  • 创建Series,使用默认索引
sel =  Series(data=[1, 'lackychen', 30, 'a teacher and a student'])

一个Series其实就是一条数据,Series方法的第一个参数是data,第二个参数是index(索引),如果没有传值会使用默认值(0-N)。

  • 创建Series,使用自定义索引
sel = Series(data=[1, 'lackychen', 30,  'a teacher and a student'], index = ['序号','姓名','年龄','评语'])

index参数是我们自定义的索引值,注意:参数值的个数一定要与元素个数相同。

  • 将字典转换为Series
dic={"red":100,"black":400,"green":300,"pink":900}
se2=Series(data=dic)

当数据是字典的时候,会将字典的键作为索引,字典的值作为索引对应的数据值。

Series是一组带索引数组,与list相似,一般我们用其承装一条数据或者一行数据。多个Series可组成一个DataFrame。

  • 通过values、index、items等Series的属性来获取各部分的全部数据
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
series = Series(data=name,index=emp)

# 获取数据的值
print(series.values)
# 获取索引的值
print(series.index.tolist())
# 获取每对索引和值
print(list(series.items()))

values、index、items返回的对象分别是List、Index、Zip类型的数据,为了方便我们使用和观察数据,可以使用series.index.tolist()和list(series.items())方法转化成List类型。
Series就像将索引值暴露在外面的List,其实它们除了外表相似以外,在获取数据方面也非常的相似。我们可以通过索引值来进行单个数据的访问,同样也支持切片选择多个数据。

from pandas import Series
emp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
series = Series(data=name,index=emp)
# 使用索引值获取单个数据
print(series['001'])
# 使用索引值获取多个不连续的数据
print('索引下标',series[['002','004']])
# 使用切片获取连续的数据
print('索引切片',series['001':'004'])
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
series = Series(data=emp,index=name)
# 使用位置下标获取单个数据
print(series[0])
# 使用位置下标获取多个不连续的数据
print('位置下标',series[[1,3]])
# 使用位置下标切片获取连续的数据
print('位置切片',series[0:3])

我们自定的index值被叫做索引下标,没有设置index值时会有一个默认的值叫做位置下标。

  • 利用循环来遍历Series

直接遍历Series的值:

# 遍历并拿到data数据
for value in series:
    print(value)

通过keys()遍历Series的索引:

# 遍历并拿到index数据
for index in series.keys():
    print(index)

通过items()遍历Series的每对索引和数据:

# 遍历并拿到每对索引和数据
for item in series.items():
    print(item)

DataFrame

DataFrame(数据表)是一种 2 维数据结构,数据以表格的形式存储,分成若干行和列。通过 DataFrame,你能很方便地处理数据。调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引。

  • 二维列表创建dataframe
lol_list = [ ['上单','TheShy',20], ['打野','小天',19], ['中单','Faker',23], ['ADC','Uzi',22], ['辅助','Ming',21] ]
df = DataFrame(data=lol_list)

有没有办法在创建DataFrame对象的时候为每一列设定一个有意义的名字呢?我们可以通过给DataFrame构造函数中的参数index,columns传值来设定DataFrame的中的行、列索引的值。

  • 二维列表创建dataframe,自定义index、columns
lol_list = [ ['上单','TheShy',20], ['打野','小天',19], ['中单','Faker',23], ['ADC','Uzi',22], ['辅助','Ming',21] ]
df = DataFrame(data=lol_list, index=['a','b','c','d','e'], columns=['位置','ID号','年龄'])
  • 使用字典创建dataframe,字典的键值作为数据的列索引值
dic={ '位置': ['上单', '打野', '中单', 'ADC','辅助'], 'ID号': ['TheShy', '小天', 'Faker', 'Uzi', 'Ming'],  'year': [20, 19, 23, 22,21]}
df=pd.DataFrame(dic)

可以把 DataFrame 理解成一组采用同样索引的 Series 的集合。DataFrame处理数据常见的操作有选取、替换行或列的数据,重组数据表、修改索引、多重筛选等。
DataFrame里的数据是按照行和列来进行排列,如何对DataFrame的数据按照行或者列进行选择、遍历以及修改。在这之前我们要清楚DataFrame中的数据情况,首先数据的维度是一维还是二维的我们可以使用ndim查看,数据的行数和列数使用shape查看,行、列的索引值使用index、columns查看。

import pandas as pd
df_dict = {
    'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
    'age':['18','20','19','22'],
    'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
# 获取行数和列数
print(df.shape)
# 获取行索引
print(df.index.tolist())
# 获取列索引
print(df.columns.tolist())
# 获取数据的维度
print(df.ndim)

数据量比较大并且我们想看数据的具体情况的时候,直接打印df比较耗时,所以我们可以只获取前几行或者后几行,了解数据的构成即可。这时候有两个法宝head()、tail()帮我们解决这个问题。

# 获取前两条
df.head(2)
# 获取后两条
df.tail(2)

两个方法都有默认值,默认值是5,当然也可以自己设置,如果数据不够5个会将全部数据拿出来。

# 通过位置索引切片获取一行
print(df[0:1])
# 通过位置索引切片获取多行
print(df[1:3])
# 获取多行里面的某几列
print(df[1:3][['name','age']])
# 获取DataFrame的列
print(df['name'])
# 获取多个列
print(df[['name','age']])

df[]不支持直接输入标签索引获取行数据,例如:df['001'];
这种方式可以获取一列数据,列如:df['name'];
如果想获取多行里面的某几列可写成:df[行][列],例如:df[1:3][['name','age']],将列索引值放到同一个列表中,再将列表放到第二个方括号中。

  • 行标签索引筛选loc[],行位置索引筛选iloc[]:
import pandas as pd

df_dict = {
    'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
    'age':['18','20','19','22'],
    'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)

# 获取某一行某一列的数据
print(df.loc['001','name'])
# 某一行多列的数据
print(df.loc['001',['name','weight']])
# 一行所有列
print(df.loc['001',:])
# 选择间隔的多行多列
print(df.loc[['001','003'],['name','weight']])
# 选择连续的多行和间隔的多列
print(df.loc['001':'003','name':'weight'])

df.loc[] 通过标签索引获取行数据,它的语法结构是这样的:df.loc[[行],[列]],方括号中用逗号分隔,左侧是行、右侧是列。注意:如果行或者列使用切片的时候,要把方括号去掉,列df.loc['001':'003','name':'weight']。
df.iloc[] 通过位置索引获取行数据,他的操作和loc[]操作是一样的,只要将标签索引改成位置索引就好了。

# 取一行
print(df.iloc[1])
# 取连续多行
print(df.iloc[0:2])
# 取间断的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 某一个值
print(df.iloc[1,0])
import pandas as pd

df_dict = {
    'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
    'age':['18','20','19','22'],
    'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
print(df.iloc[1])
print(df.iloc[0:2])
print(df.iloc[[0,2],:])
print(df.iloc[:,1])
print(df.iloc[1:3,0:1])
print(df.iloc[1,0])

需要注意的是,loc和iloc的切片操作在是否包含切片终点的数据有差异。loc['001':'003']的结果中包含行索引003对应的行。iloc[0:2] 结果中不包含序号为2的数据,切片终点对应的数据不在筛选结果中。loc是指location的意思,iloc中的i是指integer。这两者的区别如下:
loc:works on labels in the index.
iloc:works on the positions in the index (so it only takes integers).
也就是说loc是根据index来索引,比如下边的df定义了一个index,那么loc就根据这个index来索引对应的行;iloc并不是根据index来索引,而是根据行号来索引,行号从0开始,逐次加1。

  • dataframe数据遍历

iterrows(): 按行遍历,将DataFrame的每一行转化为(index, Series)对。index为行索引值,Series为该行对应的数据。

for index,row_data in df.iterrows():
    print(index,row_data)

iteritems():按列遍历,将DataFrame的每一列转化为(column, Series)对。column为列索引的值,Series为该列对应的数据。

for col,col_data in df.iteritems():
    print(col)

示例:

import pandas as pd

df_dict = {
    'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
    'age':['18','20','19','22'],
    'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])

for index, row_data in df.iterrows():
    print(index, row_data)
for col, col_data in df.iterrows():
    print(col)
    print(col_data)

相关文章

网友评论

      本文标题:Python pandas之series、DataFrame入门

      本文链接:https://www.haomeiwen.com/subject/wlxhaktx.html