数据分析之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对象等)的一维标记数组。轴标签统称为索引。

编号参数描述
1data数据采取各种形式,如:ndarray,list,constants
2index索引值必须是唯一的和散列的,与数据的长度相同。 默认np.arange(n)如果没有索引被传递。
3dtypedtype用于数据类型。如果没有,将推断数据类型
4copy复制数据,默认为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基本属性

编号属性或方法描述
1axes返回行轴标签列表。
2dtype返回对象的数据类型(dtype)。
3empty如果系列为空,则返回True。
4ndim返回底层数据的维数,默认定义:1。
5size返回基础数据中的元素数。
6values将系列作为ndarray返回。
7head()返回前n行。
8tail()返回最后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)

构造函数的参数如下:

编号参数描述
1data数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame。
2index对于行标签,要用于结果帧的索引是可选缺省值np.arrange(n),如果没有传递索引值。
3columns对于列标签,可选的默认语法是 - np.arange(n)。 这只有在没有索引传递的情况下才是这样。
4dtype每列的数据类型。
5copy如果默认值为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基本属性

编号属性或方法描述
1T转置行和列。
2axes返回一个列,行轴标签和列轴标签作为唯一的成员。
3dtypes返回此对象中的数据类型(dtypes)。
4empty如果NDFrame完全为空[无项目],则返回为True; 如果任何轴的长度为0。
5ndim轴/数组维度大小。
6shape返回表示DataFrame的维度的元组。
7sizeNDFrame中的元素数。
8valuesNDFrame的Numpy表示。
9head()返回开头前n行。
10tail()返回最后n行。
11isnull()返回DataFrame里的每个位置是否为Nan,若是Nan则True,否则False,很实用
12notnull()返回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数据 dfDataFrame

  • 通过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访pandaspd.locpd.iloc
由 于 p d 数 据 的 标 签 允 许 重 复 ( 一 对 多 ) , 如 果 访 问 数 据 使 用 的 是 标 签 , 就 会 导 致 出 现 错 误 , 因 此 墙 裂 推 荐 使 用 下 标 访 问 数 据 , 平 时 除 了 列 会 采 用 标 签 ( 一 般 也 尽 可 能 保 证 不 重 复 ) , 基 本 都 是 使 用 下 标 访 问 数 据 ( 即 p d . i l o c 而 非 p d . l o c ) _由于pd数据的标签允许重复(一对多),如果访问数据使用的是标签,就会导致出现错误,因此墙裂推荐使用下标访问数据,平时除了列会采用标签(一般也尽可能保证不重复),基本都是使用下标访问数据(即pd.iloc而非pd.loc) pd()访使使访()使访(pd.ilocpd.loc)

列数据访问

d = 'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
     'two' : pd.Series([10, 20, 30, 40], index=['a', &

以上是关于数据分析之pandas的主要内容,如果未能解决你的问题,请参考以下文章

编程之法:面试和算法心得(最大连续乘积子串)

数据结构与算法之深入解析“分裂二叉树的最大乘积”的求解思路与算法示例

Pandas 数据类型

整数划分问题之最大乘积

剑指offer(二十九)之构建乘积数组

Pandas高级数据分析快速入门之二——基础篇