Python pandas之series、DataFrame入门

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容