LogoLogo
  • README
  • 前端编程
    • 01 Node JS
    • 02-ES6详解
    • 03-NPM详解
    • 04-Babel详解
    • 05-前端模块化开发
    • 06-WebPack详解
    • 07-Vue详解
    • 08-Git详解
    • 09-微信小程序
  • 人工智能
    • 机器学习
      • 二次分配问题
      • 非负矩阵
      • 概率潜在语义分析
      • 概率图模型
      • 集成学习
      • 降维
      • 距离度量
      • 决策树
      • 逻辑回归
      • 马尔可夫决策过程
      • 马尔可夫链蒙特卡洛法
      • 朴素贝叶斯法
      • 谱聚类
      • 奇异值分解
      • 潜在狄利克雷分配
      • 潜在语义分析
      • 强化学习
      • 社区算法
      • 时间序列模型
      • 特征工程
      • 条件随机场
      • 图论基础
      • 线性分类
      • 线性回归
      • 信息论中的熵
      • 隐马尔科夫模型
      • 支持向量机
      • 主成分分析
      • EM算法
      • Hermite 矩阵的特征值不等式
      • k-means聚类
      • k近邻法
      • PageRank算法
    • 深度学习
      • Pytorch篇
        • 01-线性模型
        • 02-梯度下降法
        • 03-反向传播
        • 04-pytorch入门
        • 05-用pytorch实现线性回归
        • 06-logistic回归
        • 07-处理多维特征的输入
        • 08-加载数据集
        • 09-多分类问题
        • 10-卷积神经网络
        • 11-循环神经网络
    • 图神经网络
      • 图神经网络笔记01
        • 01-图(Graphs)的结构
        • 02-网络的性质和随机图模型
        • 03-网络工具
        • 04-网络中的主题和结构角色
        • 05-网络中的社区结构
      • 图神经网络笔记02
        • 01-深度学习引言
        • 02-神经网络基础
        • 03-卷积神经网络
        • 04-图信号处理与图卷积神经网络
        • 05-GNN的变体与框架-
        • [06-Google PPRGo 两分钟分类千万节点的最快GNN](人工智能/图神经网络/图神经网络笔记02/06-Google%20PPRGo 两分钟分类千万节点的最快GNN.md)
        • 07-序列模型
        • 08-变分自编码器
        • 09-对抗生成网络
  • 日常记录
    • 健身日记
    • 面经记录
    • 自动生成Summary文件
  • 实战项目
    • 谷粒商城
      • 00-项目概述
      • 01-分布式基础-全栈开发篇
      • 02-分布式高级-微服务架构篇
      • 03-高可用集群-架构师提升篇
  • 数据库
    • MySQL笔记
      • 01-MySQL基础篇
      • 02-MySQL架构篇
      • 03-MySQL索引及调优篇
      • 04-MySQL事务篇
      • 05-MySQL日志与备份篇
    • Redis笔记
      • 01-Redis基础篇
      • 02-Redis高级篇
    • 02-Redis篇
  • 算法笔记
    • 01-算法基础篇
    • 02-算法刷题篇
  • 职能扩展
    • 产品运营篇
  • Go编程
    • 01-Go基础
      • 01-Go基础篇
  • Java编程
    • 01-Java基础
      • 01-Java基础篇
      • 02-多线程篇
      • 03-注射与反解篇
      • 04-JUC并发编程篇
      • 05-JUC并发编程与源码分析
      • 06-JVM原理篇
      • 07-Netty原理篇
      • 08-设计模式篇
    • 02 Java Web
      • 01-Mybatis篇
      • 01-Mybatis篇(新版)
      • 02-Spring篇
      • 02-Spring篇(新版)
      • 03-SpringMVC篇
      • 04-MybatisPlus篇
    • 03-Java微服务
      • 01-SpringBoot篇
      • 01-SpringBoot篇(新版)
      • 02-SpringSecurity篇
      • 03-Shiro篇
      • 04-Swagger篇
      • 05-Zookeeper篇
      • 06-Dubbo篇
      • 07-SpringCloud篇
      • 08-SpringAlibaba篇
      • 09-SpringCloud篇(新版)
    • 04-Java中间件
      • 数据库篇
        • 01-分库分表概述
        • 02-MyCat篇
        • 03-MyCat2篇
        • 04-Sharding-jdbc篇
        • 05-ElasticSearch篇
      • 消息中间件篇
        • 01-MQ概述
        • 02-RabbitMQ篇
        • 03-Kafka篇
        • 04-RocketMQ篇
        • 05-Pulsar篇
    • 05-扩展篇
      • Dubbo篇
      • SpringBoot篇
      • SpringCloud篇
    • 06-第三方技术
      • 01-CDN技术篇
      • 02-POI技术篇
      • 03-第三方支付技术篇
      • 04-第三方登录技术篇
      • 05-第三方短信接入篇
      • 06-视频点播技术篇
      • 07-视频直播技术篇
    • 07-云原生
      • 01-Docker篇
      • 02-Kubernetes篇
      • 03-Kubesphere篇
  • Linux运维
    • 01-Linux篇
    • 02-Nginx篇
  • Python编程
    • 01-Python基础
      • 01.配置环境
      • 02.流程控制
      • 03.数值
      • 04.操作符
      • 05.列表
      • 06.元祖
      • 07.集合
      • 08.字典
      • 09.复制
      • 10.字符串
      • 11.函数
      • 12.常见内置函数
      • 13.变量
      • 14.异常和语法错误
      • 15.时间和日期
      • 16.正则表达式
    • 02 Python Web
      • flask篇
        • 01.前言
        • 02.路由
        • 03.模板
        • 04.视图进阶
        • 05.flask-sqlalchemy
        • 06.表单WTForms
        • 07.session与cookie
        • 08.上下文
        • 09.钩子函数
        • 10.flask 信号
        • 11.RESTFUL
        • 13.flask-mail
        • 14.flask+celery
        • 15.部署
        • 16.flask-login
        • 17.flask-cache
        • 18.flask-babel
        • 19.flask-dashed
        • 20.flask-pjax
        • 21.flask上传文件到第三方
        • 22.flask-restless
        • 23.flask-redis
        • 24.flask-flash
        • 25.消息通知
        • 26.分页
    • 03-Python数据分析
      • Matplotlib
      • Numpy
      • Pandas
      • Seaborn
    • 04-Python爬虫
      • 1.准备工作
      • 2.请求模块的使用
      • 3.解析模块的使用
      • 4.数据存储
      • 5.识别验证码
      • 6.爬取APP
      • 7.爬虫框架
      • 8.分布式爬虫
由 GitBook 提供支持
在本页
  • 什么是Pandas?
  • 与Numpy的区别?
  • 数据结构
  • 创建数据结构对象
  • Series
  • DataFrame
  • 读取文件
  • 增删查改
  • Series
  • DataFrame
  • 合并数据
  • merge()
  • concat()详解
  • 普通列和行index的相互转化
  • 字符串处理
  • 查看信息
  • info
  • ndim、shape、size
  • head、tail
  • memory_usage
  • describe
  • 数值运算
  • 与数据库进行交互

这有帮助吗?

在GitHub上编辑
  1. Python编程
  2. 03-Python数据分析

Pandas

什么是Pandas?

基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。

与Numpy的区别?

  • Pandas是专门为处理表格和混杂数据设计的

  • NumPy更适合处理统一的数值数组数据

数据结构

Pandas中的主要数据结构有两个:Series和DataFrame

  • Series是一种类似于一维数组(Python中的list)的对象,由一组数据和一组索引(下标)两部分组成。Series可以保存任何数据类型。

  • DataFrame是一个二维的表格型数据结构,可以把它想象成是一个Excel表格来理解,既有行索引,也有列索引。其中每列可以是不同的值类型。

  • Index也是比较常见的数据结构,虽然没有前两者那么重要,但也是必不可少的。

创建数据结构对象

Series

初步

  • 由相同元素类型构成的一维数据结构

  • 具有列表和字典的特点

In [1]:

import numpy as np
import pandas as pd
from pandas import Series
from pandas import DataFrame

In [2]:

data = [i for i in range(1,6)]
index = ['a','b','c','d','f']
s = Series(data,index=index)
s

Out[2]:

a    1
b    2
c    3
d    4
f    5
dtype: int64

In [3]:

s.index

Out[3]:

Index(['a', 'b', 'c', 'd', 'f'], dtype='object')

In [4]:

s.name

In [5]:

s.values

Out[5]:

array([1, 2, 3, 4, 5], dtype=int64)

In [6]:

s.shape

Out[6]:

(5,)

创建

Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

无索引创建

  • data为ndarray或list,则其缺少Series需要索引信息

  • 提供index,必须与data长度相同

  • 若不提供,则Series会自动生成默认数值索引range(0,data.shape[0])

In [7]:

data1 = [1,2,3]
data2 = np.array([1,2,3])
index = ['a','b','c']

s1 = Series(data1,index=index)
s2 = Series(data2,index=index)
s3 = Series(data1)

In [8]:

s1

Out[8]:

a    1
b    2
c    3
dtype: int64

In [9]:

s2

Out[9]:

a    1
b    2
c    3
dtype: int32

In [10]:

s3

Out[10]:

0    1
1    2
2    3
dtype: int64

有索引创建

  • 如果 data 为 Series 或 dict ,那么其已经提供了 Series 需要的索引信息,所以 index 项是不需要提供的

  • 如果额外提供了 index 项,那么其将对当前构建的Series进行覆盖

In [11]:

data = {
    'a':1,
    'b':2,
    'c':3,
}
index = ['e','f','g']

s1 = Series(data=data)

In [12]:

s1

Out[12]:

a    1
b    2
c    3
dtype: int64

In [13]:

s1.index = index

In [14]:

s1

Out[14]:

e    1
f    2
g    3
dtype: int64

DataFrame

初步

  • 具有共同索引的Series按排列构成(二维矩阵)

  • 类似于Excel表格

In [15]:

data = [
    [1,2,3],
    [4,5,6]
]
index = ['a','b']
columns = ['A','B','C']
df = DataFrame(data=data,index=index,columns=columns)
df

Out[15]:

A
B
C

a

1

2

3

b

4

5

6

In [16]:

df.index # 行索引

Out[16]:

Index(['a', 'b'], dtype='object')

In [17]:

df.columns # 列索引

Out[17]:

Index(['A', 'B', 'C'], dtype='object')

In [18]:

df.values

Out[18]:

array([[1, 2, 3],
       [4, 5, 6]], dtype=int64)

In [19]:

df.shape

Out[19]:

(2, 3)

In [20]:

df.dtypes # 数据类型

Out[20]:

A    int64
B    int64
C    int64
dtype: object

创建

DataFrame(data=None, index=None, columns=None)

函数由多个参数,主要参数:data,index和columns

data无行索引、无列索引

  • 如果 data 为 ndarray(2D) or list(2D),那么其缺少 DataFrame 需要的行、列索引信息

  • 如果提供 index 或 columns 项,其必须和data的行 或 列长度相同

  • 如果不提供 index 或 columns 项,那么其将默认生成数值索引range(0, data.shape[0])) 或 range(0, data.shape[1])。

In [21]:

data = np.array([
    [1,2,3],
    [4,5,6]
])
index = ['a','b']
columns = ['A','B','C']
df = DataFrame(data,index=index,columns=columns)
df

Out[21]:

A
B
C

a

1

2

3

b

4

5

6

data无 行索引,有 列索引

  • 如果data为 dict of ndarray(1D) or list(1D),所有ndarray或list的长度必须相同。且dict的key为DataFrame提供了需要的columns信息,缺失index

  • 如果提供 index 项,必须和list的长度相同

  • 如果不提供 index,那么其将默认生成数值索引range(0, data.shape[0]))

  • 如果还额外提供了columns项,那么其将对当前构建的DataFrame进行 列重索引

In [22]:

data = {'A':[1,4],'V':[4,5],'C':[6,7]}
index = ['a','b']
columns = ['A','B','C']
df = DataFrame(data,)
df

Out[22]:

A
V
C

0

1

4

6

1

4

5

7

In [23]:

df.columns = columns
df

Out[23]:

A
B
C

0

1

4

6

1

4

5

7

data有 行索引,有 列索引

  • 如果data为 dict of Series or dict,那么其已经提供了DataFrame需要的所有信息

  • 如果多个Series或dict间的索引不一致,那么取并操作(pandas不会试图丢掉信息),缺失的数据填充NaN

  • 如果提供了index项或columns项,那么其将对当前构建的DataFrame进行 重索引(reindex,pandas内部调用接口)

In [24]:

data1 = {'A':pd.Series([1,4],index=['a','b']),'V':pd.Series([4,5],index=['a','b']),'C':pd.Series([6,7],index=['a','c'])}
df1 = pd.DataFrame(data1)
df1

Out[24]:

A
V
C

a

1.0

4.0

6.0

b

4.0

5.0

NaN

c

NaN

NaN

7.0

In [25]:

data2 = {'A':{'a':1,'b':2},'V':{'a':4,'b':5},'C':{'a':7,'':8}}
df2 = pd.DataFrame(data2)
df2

Out[25]:

A
V
C

a

1.0

4.0

7.0

b

2.0

5.0

NaN

NaN

NaN

8.0

读取文件

CSV文件

pd.read_csv(filepath_or_buffer, sep=',', header='infer', names=None, index_col=None, encoding=None )
  • filepath_or_buffer:路径和文件名不要带中文,带中文容易报错

  • sep: csv文件数据的分隔符,默认是',',根据实际情况修改

  • header:如果有列名,那么这一项不用改

  • names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引

  • index_col:int型,选取这一列作为索引

  • encoding:根据你的文档编码来确定,如果有中文读取报错,试试encoding = 'gbk'

这里采用手动创建数据

import pandas as pd

# 初始数据集: 婴儿名字和出生率
names = ['Bob','Jessica','Mary','John','Mel']
births = [968, 155, 77, 578, 973]

BabyDataSet = list(zip(names, births))

df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
df

Out[1]:

Names
Births

0

Bob

968

1

Jessica

155

2

Mary

77

3

John

578

4

Mel

973

导出数据为csv格式

df.to_csv(filename, index, header)

将这两个参数设置为 False 将会防止索引(index)和列名(header names)被导出到文件中

In [2]:

df.to_csv('birthday.csv', index=False, header=False) # 将数据转化为csv文件

导入csv数据

In [3]:

df = pd.read_csv('./birthday.csv') 
df

Out[3]:

Bob
968

0

Jessica

155

1

Mary

77

2

John

578

3

Mel

973

会发现列名不正确,是错误的,需要进行调整,将header设置为None即可,想要设置自定义列名,需要通过names参数进行设置

In [4]:

df = pd.read_csv('./birthday.csv',header=None)
df

Out[4]:

0
1

0

Bob

968

1

Jessica

155

2

Mary

77

3

John

578

4

Mel

973

In [5]:

df = pd.read_csv('./birthday.csv',header=None, names=['Names', 'Births'])
df

Out[5]:

Names
Births

0

Bob

968

1

Jessica

155

2

Mary

77

3

John

578

4

Mel

973

Excel文件

pd.read_excel(io, sheetname=0, header=0, index_col=None, names=None)
  • io:文件地址

  • sheetname:表格的sheet窗口名称

  • header:如果有列名,那么这一项不用改;

  • names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引;

  • index_col:int型,选取这一列作为索引。

导出数据为xls格式

  • 用法与to_csv类似

注意运用index,header参数去掉索引和列名

In [6]:

df.to_excel('birthday.xls', index=False)

导入excel数据

In [7]:

df = pd.read_excel('birthday.xls')
df

Out[7]:

Names
Births

0

Bob

968

1

Jessica

155

2

Mary

77

3

John

578

4

Mel

973

增删查改

Series

In[1]:

import numpy as np
import pandas as pd

s = pd.Series(data=[1,2,3],index=['a','b','c'])
s

Out[1]:

a    1
b    2
c    3
dtype: int64

通过索引与切片进行查询

In [2]:

s['a'] # 通过索引返回目标值

Out[2]:

1

In [3]:

s[0:2] # 范围,左闭右开

Out[3]:

a    1
b    2
dtype: int64

In [4]:

s['a':'c'] # 注意与上不同,左右均为闭区间

Out[4]:

a    1
b    2
c    3
dtype: int64

In [5]:

s[[0,2]] # 通过列表,返回多个值

Out[5]:

a    1
c    3
dtype: int64

In [6]:

s[['a','c']] # 通过自定义索引,进行查询,返回多个值

Out[6]:

a    1
c    3
dtype: int64

In [7]:

s[[True,False,True]] # 类似于列表,返回该列表为真的相同下标的值

Out[7]:

a    1
c    3
dtype: int64

通过iloc与loc进行查询

  • loc查询方式与上述相同

  • iloc查询无视索引,只根据位置定位

基于索引--loc

In [8]:

s.loc['b'] # <==> s['b'],返回索引位置的目标值

Out[8]:

2

In [9]:

s.loc['a':'c'] # <==> s['a':'c']

Out[9]:

a    1
b    2
c    3
dtype: int64

In [10]:

s.loc[['a','c']] # <==> s[['a','c']]

Out[10]:

a    1
c    3
dtype: int64

In [11]:

s.loc[[True,False,True]] # s[[True,False,True]] 

Out[11]:

a    1
c    3
dtype: int64

基于位置--iloc

In [12]:

s

Out[12]:

a    1
b    2
c    3
dtype: int64

In [13]:

s.iloc[1] # 根据下标位置进行查询 <==> s[1]

Out[13]:

2

In [14]:

s.iloc[0:2] # 切片 <==> s[0:2]

Out[14]:

a    1
b    2
dtype: int64

In [15]:

s.iloc[[0,2]] # 切片 <==> 列表,s[[0,2]] 

Out[15]:

a    1
c    3
dtype: int64

In [16]:

s.iloc[[False, True, False]] # 切片 <==> 列表,s[[False, True, False]] 

Out[16]:

b    2
dtype: int64

修改数值

  • 直接赋值

In[1]:

import pandas as pd
import numpy as np

s = pd.Series(data=np.array([1,2,3,4]),index=['a','b','c','d'])
s

Out[1]:

a    1
b    2
c    3
d    4
dtype: int32

In [2]:

s1 = s.copy()
s1['a'] = 1000
s1

Out[2]:

a    1000
b       2
c       3
d       4
dtype: int32

In [3]:

s1[0:2] = 10
s1

Out[3]:

a    10
b    10
c     3
d     4
dtype: int32
  • 通过replace函数修改

Series.replace(to_replace=None, value=None, inplace=False)
  • to_replace:要修改的值,可以为列表

  • value:改为的值,可以为列表,与to_repalce要匹配

  • inplace:是否在原地修改

In [5]:

s2 = s1.replace(to_replace=10,value=1000)
s2

Out[5]:

a    1000
b    1000
c       3
d       4
dtype: int32

In [6]:

s2 = s1.replace(to_replace=[10,3],value=1000)
s2

Out[6]:

a    1000
b    1000
c    1000
d       4
dtype: int32

修改索引

  • 通过index进行修改

In [7]:

s1.index = ['q','w','e','r']
s1

Out[7]:

q    10
w    10
e     3
r     4
dtype: int32
  • 通过rename函数修改

Series.rename(index=None, level = None, inplace = False)
  • index:list or dict,list时必须和已有索引长度相同,dict可以部分修改

  • level:多重索引时,可以指定修改哪一重,从0开始递增

  • inplace:是否原地修改

In [9]:

s1.rename(index={'q':'f'},inplace=False)

Out[9]:

f    10
w    10
e     3
r     4
dtype: int32

添加数据

  • 增加一行

In [10]:

s2 = s.copy()
s2['e'] = 5
s2

Out[10]:

a    1
b    2
c    3
d    4
e    5
dtype: int64
  • 增加多行

Series.append(to_append, ignore_index=False, verify_integrity=False)
  • to_append: 另一个series或多个Series构成的列表;

  • ignore_index:False-保留原有索引,True-清除所有索引,生成默认数值索引;

  • verify_integrity:True的情况下,如果to_append索引与当前索引有重复,则报错。

In [11]:

s3 = pd.Series(data=[25,26],index=['h','j'])
s2.append(s3,ignore_index=False)

Out[11]:

a     1
b     2
c     3
d     4
e     5
h    25
j    26
dtype: int64

删除数据

  • 删除一行数据

In [14]:

s = pd.Series(np.arange(4),index=['a','b','c','d'])
s2 = s.drop('a')
s2

Out[14]:

b    1
c    2
d    3
dtype: int32
  • 删除多行数据

Series.drop(labels, level=None, inplace=False)
  • labels:索引,单索引或索引的列表;

  • level:多重索引需要设置;

  • inplace:是否本地修改。

In [15]:

s.drop(['b','c'])

Out[15]:

a    0
d    3
dtype: int32

DataFrame

In[1]:

import pandas as pd
import numpy as np

data = np.array([
    [1,2,3],
    [4,5,6]
])
index = ['a','b']
columns = ['A','B','C']
df = pd.DataFrame(data=data,index=index,columns=columns)
df

Out[1]:

A
B
C

a

1

2

3

b

4

5

6

##### 通过索引与切片进行查询

  • 通过列索引--查询单个值

In [2]:

df['A']

Out[2]:

a    1
b    4
Name: A, dtype: int32
  • 通过列索引--查询多个值

In [3]:

df[['A','C']]

Out[3]:

A
C

a

1

3

b

4

6

  • 查询第几行--行范围

In [4]:

df[:1]

Out[4]:

A
B
C

a

1

2

3

  • 通过布尔值,返回需要的行

In [5]:

df[[False,True]]

Out[5]:

A
B
C

b

4

5

6

  • 通过行索引查询

In [6]:

df['a':'b']

Out[6]:

A
B
C

a

1

2

3

b

4

5

6

  • 通过条件筛选查询

In [7]:

df[df>4]

Out[7]:

A
B
C

a

NaN

NaN

NaN

b

NaN

5.0

6.0

基于索引查询--loc

  • 查询单值

In [9]:

df.loc['b','B']

Out[9]:

5
  • 查询多值,通过行索引以及列索引筛选需要的值

In [10]:

df.loc['a':'b','A']

Out[10]:

a    1
b    4
Name: A, dtype: int32

In [11]:

df.loc['a','A':'B']

Out[11]:

A    1
B    2
Name: a, dtype: int32

In [12]:

df.loc[['a','b'],'B']

Out[12]:

a    2
b    5
Name: B, dtype: int32

In [13]:

df.loc[[True,True,],'B']

Out[13]:

a    2
b    5
Name: B, dtype: int32

基于位置查询--iloc

  • 查询单个值

In [14]:

df

Out[14]:

A
B
C

a

1

2

3

b

4

5

6

In [15]:

df.iloc[1,1]

Out[15]:

5

In [16]:

df.iloc[0,0]

Out[16]:

1
  • 查询多个值:第一个参数为行,第二个参数为列,均可为列表

In [20]:

df.iloc[[0,1],[1,2]]

Out[20]:

B
C

a

2

3

b

5

6

修改数值

  • 直接修改

In [18]:

df1 = df.copy()
df1.loc['a','A'] = 1000
df1

Out[18]:

A
B
C

a

1000

2

3

b

4

5

6

  • 通过replace修改

    DataFrame.replace(to_replace=None, value=None, inplace=False)
    • to_replace:要修改的值,可以为列表

    • value:改为的值,可以为列表,与to_repalce要匹配

    • inplace:是否在原地修改

    In [19]:

    df1.replace(to_replace=1000,value=5555,inplace=False)

    Out[19]:

    A
    B
    C

    a

    5555

    2

    3

    b

    4

    5

    6

  • 交换行列

In [20]:

df1[['A','B']] = df1[['B','A']]
df1

Out[20]:

A
B
C

a

2

1000

3

b

5

4

6

修改索引

  • 直接修改行索引index,列索引columns

In [21]:

df1 = df.copy()
df1

Out[21]:

A
B
C

a

1

2

3

b

4

5

6

In [22]:

df1.index = ['c','d']
df1.columns = ['C','D','E']
df1

Out[22]:

C
D
E

c

1

2

3

d

4

5

6

  • 通过rename函数进行修改

In [24]:

df1.rename(index={'c':'t'},columns={'C':'H'},inplace=False)

Out[24]:

H
D
E

t

1

2

3

d

4

5

6

添加行数据

  • 添加一行数据

In [25]:

df1 = df.copy()
df1.loc['j'] = ['7','8','9']
df1

Out[25]:

A
B
C

a

1

2

3

b

4

5

6

j

7

8

9

  • 添加多行数据

pd.concat(objs, axis=0)

确保 列索引 相同,行增加。 (其实这个函数并不要求列索引相同,它可以选择出相同的列。而我写这个教程遵循了python的宣言—明确:做好一件事有一种最好的方法,精确控制每一步,可以少犯错。)

  • objs: list of DataFrame;

  • axis: 取0,进行行增加操作。

In [26]:

df1 = pd.DataFrame(
    data=[
        [1,2,3,],
        [4,5,6],
    ],
    index=['a','b'],
    columns=['A','B','C'],
)
df2 = pd.DataFrame(
    data=[
        [7,8,9]
    ],
    index=['c','d'],
    columns=['A','B','C'],
)
pd.concat([df1,df2],axis=0)

Out[26]:

A
B
C

a

1

2

3

b

4

5

6

c

7

8

9

d

7

8

9

添加列数据

  • 添加一列数据

In [27]:

df1 = df.copy()
df1

Out[27]:

A
B
C

a

1

2

3

b

4

5

6

In [28]:

df1['D'] = [4,7]
df1

Out[28]:

A
B
C
D

a

1

2

3

4

b

4

5

6

7

  • 添加多列数据

In [29]:

df2 = pd.DataFrame(
    data=[
        [11,12],
        [14,15]
    ],
    index=['a','b'],
    columns=['E','F']
)
pd.concat([df1,df2],axis=1)

Out[29]:

A
B
C
D
E
F

a

1

2

3

4

11

12

b

4

5

6

7

14

15

删除数据

  • 删除多行数据

    DataFrame.drop(labels, axis = 0,  level=None, inplace=False)
    • labels:索引,单索引或索引的列表;

    • axis:0-删行;

    • level:多重索引需要指定;

    • inplace:是否本地修改。

In[30]:

df = pd.DataFrame(
    data = [
        [1,2,3],
        [4,5,6]
    ],
    index=['a','b'],
    columns=['A','B','C']
)
df

Out[30]:

A
B
C

a

1

2

3

b

4

5

6

In [33]:

df2 = df.copy()
df2.drop(['a'],axis=0)

Out[33]:

A
B
C

b

4

5

6

  • 删除一列删除

In [32]:

df1 = df.copy()
del df1['A']
df1

Out[32]:

B
C

a

2

3

b

5

6

  • 删除多列数据

    DataFrame.drop(labels, axis = 1,  level=None, inplace=False)
    • labels:索引,单索引或索引的列表;

    • axis:1-删列;

    • level:多重索引需要指定;

    • inplace:是否本地修改。

In [33]:

df3 = df.copy()
df3.drop(['A','C'],axis=1)

Out[33]:

B

a

2

b

5

In [34]:

df4 = df.copy()
df4.drop(columns=['A','C'],)

Out[34]:

B

a

2

b

5

合并数据

merge()

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort = False)

concat函数本质上是在所有索引上同时进行对齐合并,而如果想在任意列上对齐合并,则需要merge函数,其在sql应用很多。

  • left,right: 两个要对齐合并的DataFrame;

  • how: 先做笛卡尔积操作,然后按照要求,保留需要的,缺失的数据填充NaN;

    • left: 以左DataFrame为基准,即左侧DataFrame的数据全部保留(不代表完全一致、可能会存在复制),保持原序

    • right: 以右DataFrame为基准,保持原序

    • inner: 交,保留左右DataFrame在on上完全一致的行,保持左DataFrame顺序

    • outer: 并,按照字典顺序重新排序

  • on:列索引或列索引列表,如果要在DataFrame相同的列索引做对齐,用这个参数;

  • left_on, right_on, left_index, right_index:

    • on对应普通的列索引或列索引列表,对齐不同列名的DataFrame,用这俩参数;

    • index对应要使用的index,建议不要使用这俩参数,因为可以用concat方法代替。

  • sort: True or False,是否按字典序重新排序。

1.初步

In [1]:

import numpy as np
import pandas as pd

df1 = pd.DataFrame(
    data=np.array([
        [1,2],
        [3,4]
    ]),
    index = ['a','b'],
    columns = ['A','B']
)

df2 = pd.DataFrame(
    data=np.array([
        [1,3],
        [4,7]
    ]),
    index = ['b','d'],
    columns = ['B','C']
)

In [2]:

df1

Out[2]:

A
B

a

1

2

b

3

4

In [3]:

df2

Out[3]:

B
C

b

1

3

d

4

7

  1. 如果单纯的按照index对齐,不如用concat方法,所以一般不建议使用left_index, right_index

In [4]:

pd.merge(left = df1, right = df2, left_on='A', right_on='B')

Out[4]:

A
B_x
B_y
C

0

1

2

1

3

小区别是concat对重复列没有重命名,但是重名的情况不多,而且重名了说明之前设计就不大合理。

In [5]:

pd.concat([df1,df2],join='inner',axis=1)

Out[5]:

A
B
B
C

b

3

4

1

3

2.on用法

  • 设置how='inner'

In [6]:

# 对于'B'列,df1的b行以及df2的d行,是相同的,其他都不相同
pd.merge(left=df1,right=df2,how='inner',on=['B'])

Out[6]:

A
B
C

0

3

4

7

In [7]:

# 对于'A'列'b'行,df2的'C‘列d行是相同的,其他都不相同
# 其他列如果同名会进行重命名
pd.merge(left=df1,right=df2,how='inner',left_on=['A'],right_on=['C'])

Out[7]:

A
B_x
B_y
C

0

3

4

1

3

3.how用法

In [8]:

# 保持左侧的不便,用右侧的来进行对齐,对不齐的填NaN
pd.merge(left=df1,right=df2,how='left',on=['B'])

Out[8]:

A
B
C

0

1

2

NaN

1

3

4

7.0

In [9]:

# 保持右侧的不便,用左侧的来进行对齐,对不齐的填NaN
pd.merge(left=df1,right=df2,how='right',on=['B'])

Out[9]:

A
B
C

0

3.0

4

7

1

NaN

1

3

  • 对齐的列存在重复值

In [10]:

df1.loc['a','B']=4
df1

Out[10]:

A
B

a

1

4

b

3

4

In [11]:

df2

Out[11]:

B
C

b

1

3

d

4

7

In [12]:

# 根据B列,两个DataFrame之间不同行,有相同数据,则重新组成一行,并保持右侧# 不变
pd.merge(left=df1,right=df2,how='right',on=['B'])

Out[12]:

A
B
C

0

1.0

4

7

1

3.0

4

7

2

NaN

1

3

concat()详解

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)

1.初步

In [13]:

s1 = pd.Series(
    data=np.array([1,2,3]),
    index=['a','b','c']
)
s2 = pd.Series(
    data=np.array([4,5,6]),
    index=['e','f','g']
)
s3 = pd.Series(
    data=np.array([7,8,9]),
    index=['h','i','j']
)

In [14]:

pd.concat([s1,s2,s3])

Out[14]:

a    1
b    2
c    3
e    4
f    5
g    6
h    7
i    8
j    9
dtype: int32

In [15]:

pd.concat([s1,s2,s3],axis=1,sort=False)

Out[15]:

0
1
2

a

1.0

NaN

NaN

b

2.0

NaN

NaN

c

3.0

NaN

NaN

e

NaN

4.0

NaN

f

NaN

5.0

NaN

g

NaN

6.0

NaN

h

NaN

NaN

7.0

i

NaN

NaN

8.0

j

NaN

NaN

9.0

普通列和行index的相互转化

字符串处理

查看信息

info

DataFrame.info(verbose=None, memory_usage=True, null_counts=True)
  • verbose:True or False,字面意思是冗长的,也就说如果DataFrame有很多列,是否显示所有列的信息,如果为否,那么会省略一部分;

  • memory_usage:True or False,默认为True,是否查看DataFrame的内存使用情况;

  • null_counts:True or False,默认为True,是否统计NaN值的个数。

ndim、shape、size

查看维数,形状,元素个数

head、tail

默认分别查看头5行和后5行。

Series/DataFrame.head(n=5)
Series/DataFrame.tail(n=5)

memory_usage

Series/DataFrame.memory_usage(index=True, deep=False)
  • index:是否显示索引占用的内存,毫无疑问索引也占用内存;

  • deep:是否显示object类型的列消耗的系统资源,由于pandas中object元素只是一个引用,我估计这个deep是指显示真实的内存占用。

describe

快速查看每一列的统计信息,默认排除所有NaN元素

DataFrame.describe( include= [np.number])
  • include:'all'或者[np.number 或 np.object]。numberic只对元素属性为数值的列做数值统计,object只对元素属性为object的列做类字符串统计。

数值运算

与数据库进行交互

上一页Numpy下一页Seaborn

最后更新于3年前

这有帮助吗?