数据分析之pandas
Posted AI蜗牛之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析之pandas相关的知识,希望对你有一定的参考价值。
文章目录
之前整理了一半的Pandas,今天补完整了初级篇(其实还有不少常用的进阶方法,后面如果需要再在此基础上更新进阶篇)。
如果有人问,python里面什么工具做数据分析最方便,基本上都会脱口而出的Numpy、Matplotlib、Pandas,当然还有Scipy,不过前面三个更像是灵魂(前面两种之前也简单做过总结Numpy、Matplotlib)。当你用Pandas轻松处理excel、csv等格式的数据时,当你纵享丝滑时,你真的会爱上编程的 手 动 斜 眼 笑 _手动斜眼笑 手动斜眼笑。所以不管是对专业coder还是初学者,我觉得Pandas都是一个相当不错的工具.
Pandas 是基于NumPy ,为解决数据分析任务而创建的一种工具。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。所以下面首先介绍pandas最常用的2种基本数据格式,然后说明如何从文件中导入数据,最后总结了一些最常用的函数。
1.基本数据格式
Pandas基本包含以下三个数据结构:系列(Series)、数据帧(DataFrame)、面板(Panel)。三者的关系是:较高维数据结构是其较低维数据结构的容器,例如,DataFrame是Series的容器,Panel是DataFrame的容器。另外,这几种数据结构中都可以存储异构数据,也就是整型、字符串等基础数据类型可以混合存储。本文重点介绍两种常用的系列(Series)、数据帧(DataFrame)。
1.1.Series
1.1.1.series创建
Pandas系列可以使用以下构造函数创建
pandas.Series( data, index, dtype, copy)
系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组。轴标签统称为索引。
编号 | 参数 | 描述 |
---|---|---|
1 | data | 数据采取各种形式,如:ndarray,list,constants |
2 | index | 索引值必须是唯一的和散列的,与数据的长度相同。 默认np.arange(n)如果没有索引被传递。 |
3 | dtype | dtype用于数据类型。如果没有,将推断数据类型 |
4 | copy | 复制数据,默认为false。 |
# 赋值常用方法一: list/numpy
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103]) # 相当于s=pd.Series(data) s.index=[100,101,102,103])两行
print(s)
# 100 a
# 101 b
# 102 c
# 103 d
# 赋值常用方法二: dict
data = 'a' : 0., 'b' : 1., 'c' : 2.
s = pd.Series(data)
print(s)
更多详情:Pandas Series
1.1.2.Series基本属性
编号 | 属性或方法 | 描述 |
---|---|---|
1 | axes | 返回行轴标签列表。 |
2 | dtype | 返回对象的数据类型(dtype)。 |
3 | empty | 如果系列为空,则返回True。 |
4 | ndim | 返回底层数据的维数,默认定义:1。 |
5 | size | 返回基础数据中的元素数。 |
6 | values | 将系列作为ndarray返回。 |
7 | head() | 返回前n行。 |
8 | tail() | 返回最后n行。 |
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print(s)
#输出
#100 a
#101 b
#102 c
#103 d
print(s.axes)
#[Int64Index([100, 101, 102, 103], dtype='int64')]
print(s.size)
# 4
print(s.values)
#['a' 'b' 'c' 'd']
print(s.head(3))
#100 a
#101 b
#102 c
1.1.3.Series数据访问
Series数据访问分为两种,一种是像list/numpy里面直接使用下标,另外一种则是通过index进行访问(创建时的参数):
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
# 1.基本方法数据访问,用下标,同list/numpy
print(s[2]) # retrieve the third element
# 3
print(s[:3]) # retrieve the first three element
# a 1
# b 2
# c 3
print(s[-3:]) # retrieve the last three element
# c 3
# d 4
# e 5
# 2.标签访问数据
print(s['a'])
# 1
另外Series中也封装了上述两种方法的等价函数:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
# 1.基本方法数据访问,用下标,同list/numpy
print(s.iloc[2]) # retrieve the third element
# 3
print(s.iloc[:3]) # retrieve the first three element
# a 1
# b 2
# c 3
print(s.iloc[-3:]) # retrieve the last three element
# c 3
# d 4
# e 5
# 2.标签访问数据
print(s.loc['a'])
# 1
print(s.loc[['a', 'b']])
# a 1
# b 2
# dtype: int64
1.1.4.Series数据删除和修改
数据删除和修改:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s)
# a 1
# b 2
# c 3
# d 4
# e 5
# dtype: int64
# 数据删除
s.drop(["c", "d"], inplace=True) # inplace表示是否替换原数据,详: help(s.drop)
print(s)
# a 1
# b 2
# e 5
# dtype: int64
# 数据修改
s[1:3] = [100, 1000]
print(s)
# a 1
# b 100
# e 1000
# dtype: int64
# 数据插入
s['f'] = 100
s = s.append(pd.Series([100, 200]), verify_integrity=True)
print(s)
# a 1
# b 100
# e 1000
# f 100
# 0 100
# 1 200
# dtype: int64
1.2.DataFrame
数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。
数据帧(DataFrame)的功能特点:
- 潜在的列是不同的类型
- 大小可变
- 标记轴(行和列)
- 可以对行和列执行算术运算
1.2.1.DataFrame创建
pandas中的DataFrame可以使用以下构造函数创建 :
pandas.DataFrame( data, index, columns, dtype, copy)
构造函数的参数如下:
编号 | 参数 | 描述 |
---|---|---|
1 | data | 数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame。 |
2 | index | 对于行标签,要用于结果帧的索引是可选缺省值np.arrange(n),如果没有传递索引值。 |
3 | columns | 对于列标签,可选的默认语法是 - np.arange(n)。 这只有在没有索引传递的情况下才是这样。 |
4 | dtype | 每列的数据类型。 |
5 | copy | 如果默认值为False,则此命令(或任何它)用于复制数据。 |
Pandas数据帧(DataFrame)可以使用各种输入创建,如列表、字典、系列Numpy ndarrays、另一个数据帧(DataFrame)
# 赋值常用方法一: list/numpy
import pandas as pd
import numpy as np
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'], index=range(100,100+len(data)),dtype=float)
print(df)
# Name Age
# 100 Alex 10.0
# 101 Bob 12.0
# 102 Clarke 13.0
data = ['a': 1, 'b': 2,'a': 5, 'b': 10, 'c': 20]
df = pd.DataFrame(data, index=['first', 'second'])
print(df)
# a b c
# first 1 2 NaN
# second 5 10 20.0
# 赋值常用方法二: dict
data = 'Name':['Tom', 'Jack', 'Steve', 'Ricky'],
'Age':[28,34,29,42],
'Other': '无'
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print(df)
# Name Age Other
# rank1 Tom 28 无
# rank2 Jack 34 无
# rank3 Steve 29 无
# rank4 Ricky 42 无
# 赋值常用方法三: Series
d = 'Name':pd.Series(['Tom','James','Ricky'], index=range(100,103)),
'Age':pd.Series([25,26,25], index=range(100,103)),
'Rating':pd.Series([4.23,3.24,3.98], index=range(100,103))
df = pd.DataFrame(d)
# 上面等价于
# d ='Name':pd.Series(['Tom','James','Ricky']),'Age':pd.Series([25,26,25]),'Rating':pd.Series([4.23,3.24,3.98])
# df = pd.DataFrame(d)
# df.index = range(100,103)
print(df)
# Name Age Rating
# 100 Tom 25 4.23
# 101 James 26 3.24
# 102 Ricky 25 3.98
更多详情详情可参考:Pandas数据帧(DataFrame)
1.2.2.DataFrame基本属性
编号 | 属性或方法 | 描述 |
---|---|---|
1 | T | 转置行和列。 |
2 | axes | 返回一个列,行轴标签和列轴标签作为唯一的成员。 |
3 | dtypes | 返回此对象中的数据类型(dtypes)。 |
4 | empty | 如果NDFrame完全为空[无项目],则返回为True; 如果任何轴的长度为0。 |
5 | ndim | 轴/数组维度大小。 |
6 | shape | 返回表示DataFrame的维度的元组。 |
7 | size | NDFrame中的元素数。 |
8 | values | NDFrame的Numpy表示。 |
9 | head() | 返回开头前n行。 |
10 | tail() | 返回最后n行。 |
11 | isnull() | 返回DataFrame里的每个位置是否为Nan,若是Nan则True,否则False,很实用 |
12 | notnull() | 返回DataFrame里的每个位置是否为Nan,若不是Nan则True,否则False,很实用 |
示例如下:
import pandas as pd
d = 'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
df = pd.DataFrame(d)
print(df)
# one two
# a 1.0 1
# b 2.0 2
# c 3.0 3
# d NaN 4
print(df.T)
# a b c d
# one 1.0 2.0 3.0 NaN
# two 1.0 2.0 3.0 4.0
print(df.isnull())
# one two
# a False False
# b False False
# c False False
# d True False
1.2.3.DataFrame数据访问和遍历
1.2.3.1.数据访问
小编说~
由于一般DataFrame的列都会有自定义的列头(姓名、年龄等表示某一列的含义),而每一行不太会有自定义的行标(默认是从0开始的连续整数),所以默认的DataFrame访问时: 假 设 d f 表 示 D a t a F r a m e 数 据 _假设df表示DataFrame数据 假设df表示DataFrame数据
- 通过df[[“column1”,“column2”]]访问的是列,这里的[“column1”,“column2”]表示的是列的标签集合,这里的“column1”,"column2"也可以用对应的列的下标表示,写成[0,1]
- 通过df[3:5] 访问的是行,这里3:5表示的行下标的结合(从第三行到第五行)
所以通过上述可以看出,通过[ ]的形式访问行或者列,[ ]里面如果嵌套[ ]表示的是列,直接用下标且使用 : : :连接表示的访问的行(区间)
上面是直接通过[ ]访问数据的默认规则,当然也可以通过loc和iloc的搭配实现列、行、列行交叉访问。
所以总结一下:除了上面列出的两种直接通过[ ]的形式访问,推荐直接通过pd.loc和pd.iloc进行访问,用起来比较简单易懂。
小 编 叕 说 : 早 期 p d . i x 采 用 下 标 和 标 签 混 合 访 问 的 方 式 , 不 过 新 版 的 p a n d a s 已 经 弃 用 了 , 拆 分 为 p d . l o c 和 p d . i l o c 分 别 采 用 标 签 和 下 标 方 式 索 引 _小编叕说:早期pd.ix采用下标和标签混合访问的方式,不过新版的pandas已经弃用了,拆分为pd.loc和pd.iloc分别采用标签和下标方式索引 小编叕说:早期pd.ix采用下标和标签混合访问的方式,不过新版的pandas已经弃用了,拆分为pd.loc和pd.iloc分别采用标签和下标方式索引
由 于 p d 数 据 的 标 签 允 许 重 复 ( 一 对 多 ) , 如 果 访 问 数 据 使 用 的 是 标 签 , 就 会 导 致 出 现 错 误 , 因 此 墙 裂 推 荐 使 用 下 标 访 问 数 据 , 平 时 除 了 列 会 采 用 标 签 ( 一 般 也 尽 可 能 保 证 不 重 复 ) , 基 本 都 是 使 用 下 标 访 问 数 据 ( 即 p d . i l o c 而 非 p d . l o c ) _由于pd数据的标签允许重复(一对多),如果访问数据使用的是标签,就会导致出现错误,因此墙裂推荐使用下标访问数据,平时除了列会采用标签(一般也尽可能保证不重复),基本都是使用下标访问数据(即pd.iloc而非pd.loc) 由于pd数据的标签允许重复(一对多),如果访问数据使用的是标签,就会导致出现错误,因此墙裂推荐使用下标访问数据,平时除了列会采用标签(一般也尽可能保证不重复),基本都是使用下标访问数据(即pd.iloc而非pd.loc)
列数据访问
d = 'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([10, 20, 30, 40], index=['a', &以上是关于数据分析之pandas的主要内容,如果未能解决你的问题,请参考以下文章