我是靠谱客的博主 怕孤单电源,这篇文章主要介绍科学计算库 —— Pandas之DataFrame1 DataFrame介绍2 创建DataFrame3 常用属性4 访问数据5 处理重复数据6 删除数据7 添加数据8 修改数据9 缺失值处理10 分组11 聚合12 排序13 统计14 数据表关联15 索引设置16 数据的读取与存储,现在分享给大家,希望可以做个参考。

Pandas之DataFrame

  • 1 DataFrame介绍
  • 2 创建DataFrame
  • 3 常用属性
  • 4 访问数据
  • 5 处理重复数据
  • 6 删除数据
  • 7 添加数据
  • 8 修改数据
  • 9 缺失值处理
  • 10 分组
  • 11 聚合
  • 12 排序
  • 13 统计
  • 14 数据表关联
  • 15 索引设置
  • 16 数据的读取与存储

1 DataFrame介绍

DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引
在这里插入图片描述

2 创建DataFrame

(1)从列表创建DataFrame

复制代码
1
2
3
4
5
import pandas as pd data = [1,2,3,4,5] df = pd.DataFrame(data=data) df

在这里插入图片描述

复制代码
1
2
3
4
data = [['Alex',10],['Bob',12],['Clarke',13]] df = pd.DataFrame(data,columns=['Name','Age'],index=['a','b','c'],dtype=float) df

在这里插入图片描述

复制代码
1
2
3
4
data=[{'a':1,'b':2},{'a':7,'b':5,'c':34}] df = pd.DataFrame(data) df

在这里插入图片描述

(2)从字典来创建DataFrame

复制代码
1
2
3
4
5
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'], 'Age':[28,34,29,42]} df = pd.DataFrame(data, index=['s1','s2','s3','s4']) df

在这里插入图片描述

复制代码
1
2
3
4
5
data = {'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(data) df

在这里插入图片描述
(3)导入外部文件创建DataFrame

复制代码
1
2
df=pd.read_csv('./bikes.csv',sep=';')

3 常用属性

(1)查看前n行数据

复制代码
1
2
3
df.head(n) df.head() # 默认查看前5行

(2)查看后n行数据(默认后5行)

复制代码
1
2
3
df.tail(n) df.tail() # 默认查看后5行

(3)查看各列信息

复制代码
1
2
df.info()

(4)查看数据形状

复制代码
1
2
df.shape

(5)查看每一列的数据类型

复制代码
1
2
3
4
df.dtypes # 查看one这一列的数据类型 # df["one"].dtype

(6)查看数据值

复制代码
1
2
df.values

(7)查看数据的列名

复制代码
1
2
df.columns

(8)查看数据的索引

复制代码
1
2
df.index

将索引转换为列使用reset_index()函数

  • drop:bool,default False
    • 删除索引并将其转化成列,默认是False:转化成列;True:删除的索引直接丢弃,不转化成列
  • inplace:bool,defualt False
    • 是否在原数据上做更改,默认False:不在源数据上做更改,此时有返回值DataFrame需要变量进行赋值;True无返回值

(9)查看行/列标签列表

复制代码
1
2
df.axes

(10)判断空系列

复制代码
1
2
3
# 如果系列为空,则返回True df.empty

(11)返回底层数据的维数,默认定义:1

复制代码
1
2
df.ndim

(12)返回基础数据中的元素数

复制代码
1
2
df.size

4 访问数据

复制代码
1
2
3
4
5
6
data = {'one' : pd.Series([6, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 4, 9, 4], index=['a', 'b', 'c', 'd']), 'three' : pd.Series([2, 2, 7, 4], index=['a', 'b', 'e', 'd'])} df=pd.DataFrame(data) df

在这里插入图片描述

对于loc选取行列数据, loc是select by label(name):

  • 行根据行标签,也就是索引筛选,列根据列标签,列名筛选
  • 如果选取的是所有行或者所有列,可以用代替
  • 行标签选取的时候,两端都包含,比如[0:5]指的是0,1,2,3,4,5

对于iloc选取行列数据,iloc是select by position,仅接受整数作为参数。

  • iloc基于位置索引,简言之,就是第几行第几列,这里的行列都是从0开始的
  • iloc的0:X中不包括X,只能到X-1

df.loc的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,df.iloc同理

(1)行访问

复制代码
1
2
3
t=pd.DataFrame(np.random.rand(2),index=[1,0]) t

np.random.rand详细用法见:https://blog.csdn.net/qq_40130759/article/details/79535575

在这里插入图片描述
在这里插入图片描述
返回 df 位置索引为1和3的数据,即第二条和第四条数据

复制代码
1
2
3
df.iloc[[1,3]] df.loc[['b','d']]

在这里插入图片描述

复制代码
1
2
3
df.iloc[[0,1],[0,1]] df.loc[["a","b"],["one","two"]]

在这里插入图片描述

复制代码
1
2
df.loc["a":"d"]

在这里插入图片描述

(2)列访问

复制代码
1
2
3
4
5
6
7
8
9
# 查看one列数据 df['one'] # 查看one列的前3行数据 df['one'][:3] # 查看one、two列数据 df[['one','two']]

(3)条件访问

复制代码
1
2
3
4
d={'col1':[1,2,3],'col2':[4,5,6],'col3':[7,8,9]} d=pd.DataFrame(data=d,index=['A','B','C']) d

在这里插入图片描述
① 直接筛选

直接使用列需要满足的条件,如果需要多个列同时满足条件,使用"&"符号连接即可;如果只需要某一列满足条件,则使用"|"连接多个列的条件。

复制代码
1
2
3
4
5
6
# 返回col1列值大于1的数据 d[d['col1']>1] # 返回col1列值等于1且col2列值等于4的数据 d[(d['col1'] == 1) & (d['col2']==4)]

② 使用query函数

复制代码
1
2
3
4
5
6
7
8
# 查询col1列中数值为2的行记录 d.query('col1==2') # 查询col1列数值小于col2列的行记录 d.query('col1 < col2') # 等价于 d[d.col1 < d.col2]

③ 使用map函数

这个筛选方式和直接筛选唯一不同的就是,把筛选条件给隔离出来了

复制代码
1
2
3
4
5
6
# 返回col1列值等于1且col2列值等于4的数据 a = d['col1'].map(lambda x : x==1) b = d['col2'].map(lambda x : x==4) some = d[a & b] some

5 处理重复数据

复制代码
1
2
3
4
5
from numpy import NAN d={'col1':[NAN,2,2,4],'col2':[4,5,6,4],'col3':[7,8,9,10]} d=pd.DataFrame(data=d,index=['A','B','C','D']) d

在这里插入图片描述
(1)检查是否有重复记录

① 某一列的数据是否唯一

复制代码
1
2
3
4
5
6
7
8
9
10
# col1列的数据是否唯一 d.col1.is_unique # False,不唯一 # unique函数可以返回唯一值 unqiue=d.col1.unique() unqiue # array([nan, 2., 4.]) # nunique函数返回的是唯一值的个数(不计空缺值) d.col1.nunique() # 2

② 整个数据表是否有重复记录

DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行

复制代码
1
2
d.duplicated()

在这里插入图片描述

is_unique与duplicated都可以用于判断是否存在重复记录,区别在于:

  • is_unique:是Series的属性,即只能对系列应用该属性
  • duplicated:是DataFrame的函数,Series和DataFrame都可以使用

(2)删除重复记录

drop_duplicates()

  • subset参数选择以哪个列为去重基准,默认所有的列。
  • keep参数则是保留方式,first是保留第一个,删除后余重复值,last是删除前面,保留最后一个,默认first
  • inplace参数,布尔值,默认为False,指的是直接在原来数据上修改还是保留一个副本
复制代码
1
2
3
4
5
6
d = {'one' : pd.Series([2, 2, 3,1], index=['a', 'b', 'c','d']), 'two' : pd.Series([6, 4, 9, 4], index=['a', 'b', 'c', 'd']), 'three' : pd.Series([2, 5, 7, 4], index=['a', 'b', 'e', 'd'])} df=pd.DataFrame(d) df

在这里插入图片描述

复制代码
1
2
3
df.drop_duplicates(subset='two',keep='last') # df.drop_duplicates(subset=["one","two"])

在这里插入图片描述

6 删除数据

复制代码
1
2
3
4
d={'col1':[NAN,2,2,4],'col2':[4,5,6,4],'col3':[7,8,9,10]} d=pd.DataFrame(data=d,index=['A','B','C','D']) d

在这里插入图片描述
(1)列删除

① del

复制代码
1
2
del(d['col1'])

② pop

复制代码
1
2
d.pop('col2')

注意:delpop进行删除操作时会改变原数据,另外pop会返回删除的数据

(2)行删除

复制代码
1
2
3
d.drop('A') # 删除索引为A的行数据 d.drop(['A','B']) # 删除索引为A、B的行数据
复制代码
1
2
3
4
5
df = pd.DataFrame([['zs', 12], ['ls', 4]], columns = ['Name','Age']) df2 = pd.DataFrame([['ww', 16], ['zl', 8]], columns = ['Name','Age']) df = df.append(df2) df

在这里插入图片描述

复制代码
1
2
3
# 删除index为0的行 df.drop(0)

在这里插入图片描述

注意:对于drop()删除,如果不加axis=1,则默认axis=0按照行号进行删除。如果不设置参数inplace=True,则只能在生成的新数据块中实现删除效果,而不能删除原有数据块的相应行。

7 添加数据

(1)添加列

复制代码
1
2
3
4
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]} df = pd.DataFrame(data, index=['s1','s2','s3','s4']) df

在这里插入图片描述
① 直接添加新列

复制代码
1
2
3
4
5
# 添加score列 df['score']=pd.Series([90, 80, 70, 60], index=['s1','s2','s3','s4']) # 或者index=df.index df

在这里插入图片描述

注意:添加列数据时,若行索引不是默认的,则需要指定index

② insert()

另外,Insert用于在DataFrame的指定位置中插入新的数据列。默认情况下新列是添加到末尾的,但可以更改位置参数,将新列添加到任何位置。

复制代码
1
2
Dataframe.insert(loc, column, value, allow_duplicates=False)

参数作用:

  • loc: int型,表示插入位置在第几列;若在第一列插入数据,则 loc=0
  • column: 给插入的列取名,如 column=‘新的一列’
  • value:新列的值,数字、array、series等都可以
  • allow_duplicates: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复

③ loc()

复制代码
1
2
df.loc[:,新列名]=

(2)添加行

复制代码
1
2
3
4
df2 = pd.DataFrame([['ww', 16,77], ['zl', 8,99]], columns = ['Name','Age','score'],index=['s5','s6']) df = df.append(df2) df

在这里插入图片描述

注意:即使原数据的行索引为默认值,添加行数据时也要按顺序指定索引,否则添加数据的行索引会默认重新从0开始

8 修改数据

复制代码
1
2
3
4
# 将Name列的第三行数据修改成“HUWEI” df['Name'][2]='HUWEI' df

在这里插入图片描述

9 缺失值处理

复制代码
1
2
3
df=pd.DataFrame([[1,4,9],[NAN,NAN,NAN],[8,0,NAN]]) df

在这里插入图片描述
(0)查找缺失值

isnull()可以用于判断 dataframe 或者 series 的空值
notnull()判断非空值

空值包括

查找第3列是否有缺失值,有多少个缺失值
在这里插入图片描述

(1)删除缺失值

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
# axis=0: 删除包含缺失值的行(默认) df.dropna() # axis=1: 删除包含缺失值的列 df.dropna(axis=1) # how='all': 所有的值都缺失,才删除行或列 df.dropna(how='all') # how=‘any’ :只要有缺失值出现,就删除该行或列 df.dropna(how='any')

(2)填充缺失值

fillna()

  • 传入method=" "重新索引时选择插值处理方式:
    • method='ffill'或'pad' 前向填充(看前一个是什么,它就填充什么)
    • method='bfill'或'backfill' 后向填充(看后一个是什么,它就填充什么)
  • 传入limit参数限制填充个数
  • 传入axis参数修改填充方向,默认axis=0纵向填充,axis=1横向填充
  • inplace=True改变原数据

10 分组

复制代码
1
2
3
4
5
6
7
8
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2], 'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017], 'Points':[876,789,863,673,741,812,756,788,694,701,804,690]} df = pd.DataFrame(ipl_data) df

在这里插入图片描述
groupby返回可迭代对象,可以使用for循环遍历

复制代码
1
2
3
4
5
6
7
8
9
10
11
grouped=df.groupby('Year') grouped # <pandas.core.groupby.DataFrameGroupBy object at 0x000001BD6977B3C8> grouped.groups """ {2014: Int64Index([0, 2, 4, 9], dtype='int64'), 2015: Int64Index([1, 3, 5, 10], dtype='int64'), 2016: Int64Index([6, 8], dtype='int64'), 2017: Int64Index([7, 11], dtype='int64')} """
复制代码
1
2
3
4
for year,group in grouped: print(year) print(group)

在这里插入图片描述
获得一个分组细节

复制代码
1
2
grouped.get_group(2014)

在这里插入图片描述

11 聚合

聚合每一年的分数之和、平均分、标准差

复制代码
1
2
3
agg = grouped['Points'].agg([np.sum, np.mean, np.std]) agg

在这里插入图片描述

12 排序

复制代码
1
2
3
4
5
6
7
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack', 'Lee','David','Gasper','Betina','Andres']), 'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]), 'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])} unsorted_df = pd.DataFrame(d) unsorted_df

在这里插入图片描述
(1)降序

复制代码
1
2
3
4
# ascending=False表降序,默认ascending=True升序,默认按行标签排序 sorted_df = unsorted_df.sort_index(ascending=False) sorted_df

在这里插入图片描述
(2)按列标签排序

复制代码
1
2
3
sorted_df=unsorted_df.sort_index(axis=1) sorted_df

在这里插入图片描述
(3)按实际值排序

sort_values()是按值排序的方法,参数inplace=True可以改变原数据,它还接受一个by参数,它将使用要与其排序值的DataFrame的列名称。

复制代码
1
2
3
4
# 按照年龄排序(升序) sorted_df = unsorted_df.sort_values(by='Age') sorted_df

在这里插入图片描述

复制代码
1
2
3
4
# 先按Age进行升序排序,然后按Rating降序排序 sorted_df = unsorted_df.sort_values(by=['Age', 'Rating'], ascending=[True, False]) sorted_df

在这里插入图片描述

13 统计

数值型数据的描述性统计主要包括了计算数值型数据的完整情况、最小值、均值、中位 数、最大值、四分位数、极差、标准差、方差、协方差等。在NumPy库中一些常用的统计学函数也可用于对数据框进行描述性统计。

在这里插入图片描述
pandas提供了统计相关函数:
在这里插入图片描述

在这里插入图片描述

复制代码
1
2
3
4
# 测试描述性统计函数 df.sum() # 默认计算纵向数据的和 df.sum(1) # 计算横向数据的和

一般分类数据用value_counts(),数值数据用describe(),这是最常用的两个统计函数
value_counts() 方法是Series拥有的方法,它返回一个序列 Series,该序列包含每个值的数量。也就是说,对于数据框中的任何列,value-counts () 方法会返回该列每个项的计数。

复制代码
1
2
3
4
df.describe() # 该函数可以对某一列进行分析 # df["Age"].describe()
  • include参数:包含哪类数据。默认只包含连续值,不包含离散值;include = ‘all’ 设置全部类型
  • percentiles参数:设置输出的百分位数,默认为[.25,.50,.75],返回第25,50,75百分位数

对连续值来说:

  • count:每一列非空值的数量
  • mean: 每一列的平均值
  • std:每一列的标准差
  • min:最小值
  • 25%:25%分位数,排序之后排在25%位置的数
  • 50%:50%分位数
  • 75%:75%分位数
  • max:最大值

对离散值来说特有的:

  • unique:不重复的离散值数目,去重之后的个数
  • top: 出现次数最多的离散值
  • freq: 上述的top出现的次数

在这里插入图片描述

复制代码
1
2
df.Age.value_counts()

在这里插入图片描述

14 数据表关联

(1)merge()合并

复制代码
1
2
3
4
pd.merge(left, right, how = ‘inner’, on = None, left_on = None, right_on = None, left_index = False, right_index = False, sort = True, suffixes = (‘_x’,’_y’), copy = True, indicator = False, validate = None)

参数:

  • left、right:需要连接的两个DataFrame或Series,一左一右
  • how:两个数据连接方式,可设置inner、outer、left或right,默认的方式是inner join,取交集,也就是保留左右表的共同内容;如果是left join,左边表中所有的内容都会保留;如果是right join,右表全部保留;如果是outer join,则左右表全部保留。关联不上的内容为NaN
  • on:作为连接键的字段,左右数据中都必须存在,否则需要用left_on和right_on来指定
  • left_on:左表的连接键字段
  • right_on:右表的连接键字段
  • left_index:为True时将左表的索引作为连接键,默认为False
  • right_index:为True时将右表的索引作为连接键,默认为False
  • suffixes:如果左右数据出现重复列,新数据表头会用此后缀进行区分,默认为_x和_y

① 连接键 on

在数据连接时,如果没有指定根据哪一列(连接键)进行连接,Pandas会自动找到相同列名的列进行连接,并按左边数据的顺序取交集数据。为了代码的可阅读性和严谨性,推荐通过on参数指定连接键

复制代码
1
2
3
4
5
df1 = pd.DataFrame({'a':[1,2],'b':[5,6]}) df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]}) # 按a列进行连接,数据顺序取df1的顺序 res = pd.merge(df1, df2, on='a')

在这里插入图片描述
② 索引连接

可以直接按索引进行连接,将left_index和right_index设置为True,会以两个表的索引作为连接键

复制代码
1
2
3
4
5
df1 = pd.DataFrame({'a':[1,2],'b':[5,6]}) df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]}) # 两个表都有同名的a列,用suffixes参数设置后缀来区分 res = pd.merge(df1, df2, left_index=True, right_index=True, suffixes=('_1','_2'))

在这里插入图片描述
③ 多连接键

如果在合并数据时需要用多个连接键,可以以列表的形式将这些连接键传入on中

复制代码
1
2
3
4
5
df1 = pd.DataFrame({'a':[1,2],'b':[3,4],'x':[5,6]}) df2 = pd.DataFrame({'a':[1,2,3],'b':[3,4,5],'y':[6,7,8]}) # a和b列中的(1,3)和(2,4)作为连接键将两个数据进行了连接 res = pd.merge(df3, df4, on=['a','b'])

在这里插入图片描述
④ 连接指示
如果想知道数据连接后是左表内容还是右表内容,可以使用indicator参数显示连接方式
如果将indicator设置为True,则会增加名为_merge的列,显示这列是从何而来

_merge有以下三个值:

  • left_only:只在左表中
  • right_only:只在右表中
  • both:两个表都有
复制代码
1
2
3
4
5
6
import pandas as pd df1 = pd.DataFrame({'a':[1,2],'b':[5,6]}) df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]}) # 显示连接指示列 res = pd.merge(df1, df2, on='a', how='outer', indicator=True)

在这里插入图片描述
(2)concat()合并

concat()函数可以沿着指定的轴将多个dataframe或者series拼接到一起。

复制代码
1
2
pd.concat( objs, axis=0, join=‘outer’, join_axes=None,ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)

参数:

  • objs 表示需要连接的对象,比如:[df1, df2],需要将合并的数据用方括号包围;
  • axis=0 表拼接方式是上下堆叠,当axis=1表示左右拼接;
  • join 参数控制的是外连接还是内连接,inner,outer,这里默认值是outer并集
  • ignore_index,连接后原来两个DF的index值会被保存,设置true,合并的两个表就会重新整理一个新的index

15 索引设置

(1)将某一列设置为索引

复制代码
1
2
3
rs=rs.set_index('student_name') rs

在这里插入图片描述
(2)重新设置索引

reset_index()

  • drop: 重新设置索引后是否将原索引作为新的一列并入DataFrame,默认为False
  • inplace: 是否在原DataFrame上改动,默认为False

16 数据的读取与存储

(1)读取与存储csv

复制代码
1
2
3
4
5
6
7
pd.read_table( filepath_or_buffer, sep='t', header='infer', names=None, index_col=None, dtype=None, engine=None, nrows=None) pd.read_csv( filepath_or_buffer, sep=',', header='infer', names=None, index_col=None, dtype=None, engine=None, nrows=None)

参数:

  • filepath 文件路径。该字符串可以是一个URL。有效的URL方案包括http,ftp和file
  • sep 分隔符。read_csv默认为“,”,read_table默认为制表符“[Tab]”。
  • header 接收int或sequence。表示将某行数据作为列名。默认为infer,表示自动识别。
  • names 接收array。表示列名。
  • index_col 表示索引列的位置,取值为sequence则代表多重索引。
  • dtype 代表写入的数据类型(列名为key,数据格式为values)。
  • engine 接收c或者python。代表数据解析引擎。默认为c。
  • nrows 接收int。表示读取前n行。
复制代码
1
2
df.to_csv(excel_writer=None, sheetname=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)

(2)读取与存储excel

复制代码
1
2
pd.read_excel(io, sheetname=0, header=0, index_col=None, names=None, dtype=None)

参数:

  • io 表示文件路径。
  • sheetname 代表excel表内数据的分表位置。默认为0。
  • header 接收int或sequence。表示将某行数据作为列名。默认为infer,表示自动识别。
  • names 表示索引列的位置,取值为sequence则代表多重索引。
  • index_col 表示索引列的位置,取值为sequence则代表多重索引。
  • dtype 接收dict。数据类型。
复制代码
1
2
DataFrame.to_excel(excel_writer=None, sheetname=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)

(3)读取与存储JSON

复制代码
1
2
3
4
# 通过json模块转换为字典,再转换为DataFrame df = pd.read_json('./test.json') print(df)
复制代码
1
2
3
4
5
with open("test.json","r") as f: data = json.loads(f.read()) df = pd.DataFrame(data) print(df)

最后

以上就是怕孤单电源最近收集整理的关于科学计算库 —— Pandas之DataFrame1 DataFrame介绍2 创建DataFrame3 常用属性4 访问数据5 处理重复数据6 删除数据7 添加数据8 修改数据9 缺失值处理10 分组11 聚合12 排序13 统计14 数据表关联15 索引设置16 数据的读取与存储的全部内容,更多相关科学计算库内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部