文章目录

  • 0. 基本概念
    • Series
      • (一)创建Series
      • (二)Series的简单操作
    • DataFrame
      • (一)创建DataFrame
  • 1. 数据选取
    • 1.1 [[]]
    • 1.2 copy()
    • 1.3 列操作
    • 1.4 行操作
    • 1.5 行-列
    • 1.6 数据筛选
  • 2. 加载数据
    • 2.1 Txt
    • 2.2 Csv
    • Excel
  • 3. 排序与合并
    • 3.1 Series排序
    • 3.2 DataFrame排序
    • 3.3 Rank
    • 3.4 merge(按列匹配合并)
    • 3.5 concat(数据的拼接)
  • 4. 数据汇总
    • 4.1 特殊值(info, describe)
    • 4.2 分组统计
  • 5. 时间序列
    • 5.1 初始化时间序列
    • 5.2 时间索引
    • 5.3 重采样
  • 参考资料

0. 基本概念

Pandas的数据类型是一张表,可以把Pandas理解为内存型的数据库。

import pandas as pd

Series:列
DataFrame:表

Series

(一)创建Series

1. 使用列表list创建Series
(1)默认列表索引从0 - n-1

# 使用列表List初始化序列,索引值默认为0-n
ser = pd.Series(['张三', '李四', '王五'])
ser

0 张三
1 李四
2 王五
dtype: object

(2)可以通过 index 参数指定索引值

ser = pd.Series(['张三', '李四', '王五'], index = list(range(1,4)))  # index 指定索引值
ser

1 张三
2 李四
3 王五
dtype: object

2. 使用字典dict创建Series
(1)默认索引值为字典的’key’值

data = {'Beijing': 9240, 'Shanghai': 8960, 'Guangzhou': 7400}
ser3 = pd.Series(data)
ser3

Beijing 9240
Shanghai 8960
Guangzhou 7400
dtype: int64

(二)Series的简单操作

1. 修改元素值
(1)修改单独元素值
需要指定索引,可以修改指定索引的元素值。
(2)修改整列元素值
直接对Series操作,会修改整列元素值

ser2 = pd.Series([18, 19, 20], index = range(1,4))
ser2 + 1

1 19
2 20
3 21
dtype: int64

2. 类型转换

转换 代码
series -> dict .to_dict()
series -> list .to_list()
series -> frame .to_frame()
series -> json .to_json()
ser3.to_frame()

DataFrame

(一)创建DataFrame

1. 由numpy创建
numpy初始化创建的DataFrame的索引(index)和列名(columns)都是由 0 - n-1 的数字组成。

import numpy as np
data = np.arange(100, 109).reshape(3, -1)
df = pd.DataFrame(data)
df

2. 由dict创建
dict初始化创建的DataFrame的列名与dict的key值保持相同

data = {'name':['Jack', 'Marry', 'Ken'],'age': [19, 20, 17],'height': [1.68, 1.76, 1.80]
}
df = pd.DataFrame(data)
df

3. 索引与列名
可以通过.columns获得列名,.index获得索引。可以在初始化时指定索引和列名或者后期更改

df1 = pd.DataFrame(data, columns=['name','age','height','email'], index = range(1,4))
df1

# 获取列名
df.columns
# 索引信息
df.index
# 修改列名
df.columns = ['userName', 'age', 'height']
# 修改行索引
df.index = ['ABC']  # 通过字符串赋值
df.index = range(df.shape[0])
df

Index([‘name’, ‘age’, ‘height’], dtype=‘object’)
RangeIndex(start=0, stop=3, step=1)

1. 数据选取

  1. Index:返回DataFrame行的索引列表,常用于索引切片
  2. Columns:返回DataFrame列的索引,常用于索引和切片
  3. loc:返回DataFrame指定自定义索引的行
  4. iloc:返回DataFrame指定真是位置索引的行
    注意:loc[], columns[]都是索引向量。
  5. shape:返回DataFrame行数、列数的列表
  6. drop(index , axis = ):删除指定索引,指定行(0)列(1)的元素
  7. [], [[]]:分别以Series和DataFrame形式从DataFrame中读取数据
  8. iat[x, y]:返回指定行列元素

1.1 [[]]

需要取出DataFrame某一列时,得到的是Series变量。有些时候需要取出的列为DataFrame格式。

# 取出一列(Series格式)
df['name']
df.name# DataFrame格式
df[['name', 'age']]

0 张三
1 李四
2 王五
3 赵六
Name: name, dtype: object

1.2 copy()

由于DataFrame的特性,对提取出的某一列的修改会影响到主表的值。当需要独立修改列提取出来的列数据时,可以采用copy()函数。

names = df.name.copy()
names[0] = '张三'
names
df

0 张三
1 李四
2 王五
3 赵六
Name: name, dtype: object

1.3 列操作

包括对列的增、删、改、查
1. 增加列
直接通过索引值新增一列

import datetime   # 获得出生年月
df['year'] = datetime.datetime.now().year - df.age
df

2. 删除指定列
df.drop(索引,axis = 1):axis默认为0,表示行。

df1 = df.drop('year', axis = 1)   # 默认为0,删除列时需要指定为1
df1

注意:drop()函数不会改变调用对象本身,获得值需要使用新的变量保存

3. 修改某列元素
通过[]或[[]]得到某列后,修改指定元素。这次修改会影响到DataFrame。

4. 查看某列元素
使用“[]”或“[[ ]]”以Series或DataFrame的格式输出某一列或几列

1.4 行操作

包括对行的增、删、改、查
1. 在指定位置增加行
.loc[]能够返回指定索引值行的元素。DataFrame[]可以直接操作列元素,操作行元素时需要添加loc[]函数

# 在最后一行插入
df.loc[df.shape[0]] = {'age':21,'name':'LongXin','height':1.76,'year':2001}
df

2. 删除指定行

  1. 通过.drop()函数,删除指定索引的行
df = df.drop(df.shape[0]-1, axis =0)
df = df.drop(2, axis =0)
df


删除后,行索引中缺少了2,因此需要重新更新行索引

  1. 通过index函数,重新恢复行索引
df.index = range(df.shape[0])
df

3. 查找某行元素

  • loc[]: 根据自定义的索引值查找,行索引中必须有指定索引值,否则会发生报错。
  • iloc[]: 根据物理位置的索引值查找,行索引中不一定有指定索引值

1.5 行-列

当我们希望找到指定行、指定列时,可以采用loc[]结合行索引和列索引、iat[]直接索引
例如,我们想获得倒数2行,'age’和’name’列的数据

df.loc[df.index[-2:], ['name', 'age']]
df

df1
df1.iat[1,1] = 66
df1


![在这里插入图片描述](https://img-blog.csdnimg.cn/89c6fbc5999d44519b1181cb8ae5807c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YagbG9uZ-mmqA==,size_1 0,color_FFFFFF,t_70,g_se,x_16)

1.6 数据筛选

  • 筛选指定范围数据
  • 筛选指定元素数据
  • [ ], loc
  • query(’’)
  • isin

(1)筛选指定范围数据
可以使用[], loc, query()三种方法筛选出指定范围的数据。
方法一:[ [判断语句] ]嵌套
将复合条件的所有行的所有列输出

df['height'] >= 1.65
df[df['height'] >= 1.65]

0 True
1 True
2 True
3 True
4 True
Name: height, dtype: bool

方法二:loc(判断语句,指定列)
在[ [ ] ]的基础上,可以输出复合条件的所有行的指定列元素。

df.loc[(df['height'] >= 1.65)&(df['age']<=20),['name', 'age', 'height']]

方法三:query(‘字符串’)
通过判断字符串,输出符合条件的数据。效果与[ [判断] ]相同。

df.query('height >=1.65 and age <=20 or name == "jack" ')
age = 20
df.query('age < @age')  # @变量


方法四:isin()
判断元素是否在指定列中,然后返回指定元素

# isin() 判断元素是否存在
df['age'].isin([18,19])
df[df['age'].isin([18,19])]

0 True
1 False
2 False
3 False
4 False
Name: age, dtype: bool

2. 加载数据

  1. Text
  2. CSV
  3. Excel
  4. Html
  5. MySQL

2.1 Txt

通过pd.read_table函数可以读取txt文件,其中有如下重要参数

  • sep:默认为tab,指定分割符
  • header:默认第一行为列名,选择None可以取消
  • names:人为设定列名,默认为0-n
pd.read_table('D:\\Jupyter_notebook\\pandas_data\\03.txt', sep = ':', header =None )
pd.read_table('D:\\Jupyter_notebook\\pandas_data\\03.txt', sep = ':', header =None, names = ['name', 'pwd', 'uid', 'gid', 'local', 'home', 'shell'] )


2.2 Csv

通过pd.read_csv文件读取,csv文件是以,为分割符的文件。重要参数如下

  • header:默认第一行为列名,选择None可以取消
# csv 数据由,进行分割
pd.read_csv('D:\\Jupyter_notebook\\pandas_data\\04.csv')

Excel

需要引入xlrd包,通过pd.read_excel()读取excel文件。重要参数如下:

  • header:默认第一行为列名,选择None可以取消
# Excel
import xlrd
pd.read_excel('D:\\Jupyter_notebook\\pandas_data\\05.xlsx')

3. 排序与合并

  1. Sort
  2. rank
  3. merge
  4. Concat

3.1 Series排序

  • sort_index(ascending = True):按序号排序,默认为True即按升序
  • sort_values(ascending = True):按值排序,默认为True即按升序

3.2 DataFrame排序

  • sort_index(axis = 0, ascending = True):按行或列序号排序(0 or 1),默认为1 and True即按行序号的升序
  • sort_values(by = [], ascending = True):按指定列的值排序,默认为True即按升序
df = pd.DataFrame(arr, index = [0,2,1], columns = list('cab'))
# 单独对DataFrame的某一列排序
df.sort_values(by = ['c','a'], ascending = False)

3.3 Rank

获得每个元素在对应列从小到大的排序。常见参数如下:

  • method = ‘average’
    ‘average’:当大小相同时,取平均值为序
    ‘max’:当大小相同时,取最大序号
    ‘min’:当大小相同时,取最小序号
    ‘first’:当大小相同时,按照在内存中的存储顺序为序
df.rank()  # 获得每个元素在对应列按照从小到大的排名
df.rank(method = 'first')  # 默认为average, first表示相同时按内存先后进行排序
df.rank(method = 'min')  # min max表示相同时取min or max
df.rank(method = 'max')  # min max表示相同时取min or max

3.4 merge(按列匹配合并)

  • pd.merge(df1, df2, on = ‘X’, how = ‘inner’)
    将df1, df2按照X属性合并。可能的方法有inner_join(只有匹配的项), left_join(df2对df1进行描述), right_join(df1对df2进行描述), outer_join(包含所有项,无匹配项的为NaN)。
    inner只输出匹配的项,left, right输出指定项,outer输出所有项。
df1 = pd.DataFrame({'number': ['s1', 's2', 's1', 's3', 's1', 's1', 's2', 's4'],'score':  np.random.randint(50, 100, size = 8),
})
df1
df2 = pd.DataFrame({'number': ['s1', 's2', 's3', 's5'],'name':  ['张三', '李四', '王五', '赵六']
})
df2


pd.merge(df1, df2, on = 'number')  # inner_join 连接方式

pd.merge(df1, df2, on = 'number', how = 'left')  # 左连接

pd.merge(df1, df2, on = 'number', how = 'right')  # 右连接

pd.merge(df1, df2, on = 'number', how = 'outer')  # 右连接

3.5 concat(数据的拼接)

当我们有多个表格需要拼接到一块儿时,可以采用concat进行表格拼接

  • concat([df1, df2], axis = 0)
    将df1, df2纵向(axis = 0默认)或横向(axis = 1)拼接
data = np.arange(1, 5).reshape(2,-1)
df1 = pd.DataFrame(data)
df2 = pd.DataFrame(np.zeros((2,2)))
# 数据的拼接
pd.concat([df1, df2])
# 数据的拼接
pd.concat([df1, df2], axis = 1)


4. 数据汇总

  1. describe
  2. info
  3. count
  4. mean
  5. sum

数据处理步骤

  1. 数据初探:通过head(5), tail(5)查看首尾元素,了解数据结构。
  2. 特殊值查看:通过info(), describe()查看包括NaN、元素个数、标准差、中位数等特殊数值

4.1 特殊值(info, describe)

data = [[1, None],[None, None],[8, 9],[3, 4]
]
df = pd.DataFrame(data, columns = ['a', 'b'])
# 数据处理第一步:数据结构+特殊值 head() -> info() --> describe()
df.info()   # 行列、数据类型、None值个数及列分布、内存占用
df.describe() # 数据个数、分布描述


4.2 分组统计

DataFrame可用通过groupby(‘X’)函数,以X或[X,…]为列别将DataFrame进行划分。通过对不同的分类层数使用如sum(), max()等函数,统计各个类别的数量。还可以通过for循环,输出分类结果。

import xlrd
df = pd.read_excel('D:\\Jupyter_notebook\\pandas_data\\data.xlsx')
df

# 分类统计
grouped = df.groupby('类别')
for name, data in grouped:print(name)print(data)
# 各类别所属元素
for name, data in grouped:print(name)print(data['名称'].unique())

服装
日期 名称 类别 单价 数量 金额
0 2018-07-01 商品A 服装 20 2 40
1 2018-07-02 商品B 服装 200 3 600
3 2018-07-04 商品A 服装 22 5 110
4 2018-07-05 商品B 服装 220 6 1320
6 2018-07-07 商品A 服装 30 3 90
7 2018-07-08 商品A 服装 800 1 800
9 2018-07-10 商品B 服装 230 3 690
10 2018-07-11 商品A 服装 28 1 28
食品
日期 名称 类别 单价 数量 金额
2 2018-07-03 商品C 食品 1200 4 4800
5 2018-07-06 商品C 食品 1000 7 7000
8 2018-07-09 商品C 食品 1300 4 5200


服装
[‘商品A’ ‘商品B’]
食品
[‘商品C’]

grouped = df.groupby(['类别', '名称'])
grouped[['单价']].max()

5. 时间序列

  1. datetime
  2. time
  3. date_range:date_range(start, end, freq= , periods=)生成时间序列
  4. to_datetime:将date_range()产生的时间序列转换为时间索引
  5. set_index
  6. resample:重新采样,重新组织时间序列的采样频率

5.1 初始化时间序列

Pandas使用pd.date_range()初始化时间序列。有两种初始化方法。

  • 指定起止时间
  • 指定开始时间与需要个数

其中date_range()包含两个重要参数:

  1. freq = ‘D’:设置序列频率。默认为D一天为单位,常见有 ‘w’:周,‘M’:月,‘Q’:季度,‘H’:时,‘T’:分,‘S’:秒
  2. period:指定序列个数
pd.date_range('2018-5-1', '2020-2-15',freq = 'Q')
# 未知起始日期,指定periods长度
pd.date_range('2020-05-01', freq = 'Q', periods = 10)


5.2 时间索引

由date_range生成的时间序列不能直接作为时间索引。需要==to_datetime()==函数将其转换为索引。
将时间转换为索引后,对时间引用的便捷程度将大大提升。

from datetime import datetime
import numpy as np
data = {'time': pd.date_range('2022-01-01', periods = 200000, freq = 'T'),'cpu' : np.random.randn(200000) + 10
}
df = pd.DataFrame(data)
df# 让时间作为索引
s = pd.to_datetime(df.time)
df.index = s
df = df.drop('time', axis = 1)
df


某一时间段

df['2022-02-03 08:30:00':'2022-03-03 08:30:00']

指定时间

df['2022-02-15']

分组

df.groupby(df.index.date).mean()  # date 天分组

5.3 重采样

通过resample()函数对时间序列进行重采样,其中常见参数:

  • ‘nT’:表示以n分钟的频率重采样。常见的还有’H’, ‘S’, ‘Q’, ‘W’, ‘D’
# 重采样
df.resample('5T').mean()

参考资料

[1] https://edu.csdn.net/learn/26273/326984

Python数据处理——pandas相关推荐

  1. #第17篇分享:python数据处理-pandas,numpy,matplotlib

    #python数据处理-pandas,numpy,matplotlib: 对于数据来说,有数据爬取-爬虫,数据处理-就是今天学习的,以及数据分析-sklearn,tensoflow机器学习及深度学习: ...

  2. python数据处理----pandas导入和导入文件

    pickle文件的导入和导出: 保存为pickle文件: 读取pickle文件: csv文件的导入和导出 保存为csv文件: Excel文件的导入和导出 保存为Excel文件: Series数据对象不 ...

  3. python数据处理——pandas.read_csv()指定行索引和列索引

    一个比较简单的办法就是这样的 df=pd.read_csv('file.csv',header=0,index_col=0)

  4. 【Python】Pandas基础:结构化数据处理

    python:Pandas基础:结构化数据处理 目录: 文章目录 @[toc] 一 pandas及其重要性 二 pandas的数据结构介绍 1 Series 2 DataFrame 3 索引对象 三 ...

  5. Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略

    Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介.具体案例.使用方法之详细攻略 目录 pandas中数据处理常用函数(isnull/dropna/fillna/ ...

  6. Python 数据处理工具 Pandas(上)

    序列与数据框的构造 外部数据的读取(文本文件读取.电子表格读取.数据库数据读取) 数据类型转换及描述统计 字符与日期数据的处理 数据清洗方法(重复观测处理.缺失值处理.异常值处理) 数据子集的获取 透 ...

  7. python数据处理工具-Pandas笔记

    序列与数据框的构造 Pandas模块的核心操作对象就是序列Series和数据框DataFrame序列可以理解为数据集中的一个字段数据框是指含有至少两个字段(或序列)的数据集. 构造序列 可以通过以下几 ...

  8. Python数据处理库pandas中的DataFrame数据结构简介

    pandas 中有两大 数据结构 Series和 DataFrame. 本文主要介绍DataFrame的用法.DataFrame可以处理 表格数据. Series介绍在 Python数据处理库pand ...

  9. python数据处理模块pandas_数据处理工具--Pandas模块

    强大的数据处理模块Pandas,可以解决数据的预处理工作,如数据类型的转换.缺失值的处理.描述性统计分析和数据的汇总等 一.序列与数据框的构造 Pandas模块的核心操作对象为序列和数据框.序列指数据 ...

最新文章

  1. spyder上怎样将figure框出来_怎样将数据中心现有的物理机和虚拟机平滑的迁移到云平台上?...
  2. 复杂链表的复制(递归的两种实现方式)
  3. 【贪心】最大连续数列的和
  4. LeetCode:Path Sum II
  5. linux下使用free命令查看实际内存占用(可用内存)
  6. 路由表 (2012-03-27 12:57)
  7. php debug 打印变量_PHP_Debug显示所有变量
  8. PP-OCR论文笔记
  9. 无锡php公司,start.php
  10. DB 管理的重要工具(数据字典)
  11. 行业揭秘:A股日内“T+0” 赚钱的方法
  12. Unity-DLL反编译学习
  13. 智能创新引导工具软件——工作量分配和里程碑安排
  14. 内网访问高德地图nginx代理
  15. 管理系统页面布局 html,25 个精美的后台管理界面模板和布局
  16. tushare获取沪深300指数历史_tushare正确爬取 指数数据
  17. C# 编译 与 CLR
  18. Maven下载及安装教程详解
  19. wireshark网络分析器的学习使用
  20. DHTML 大全分析

热门文章

  1. Java OOP 7 JAVA 集合框架
  2. Linux spi驱动分析(四)----SPI设备驱动(W25Q32BV)
  3. 466. 统计重复个数
  4. 【参透浏览器原理】1—— 为什么明明浏览器只打开了一个页面,却出现了多个进程
  5. Linux 虚拟鼠标,键盘 之一。
  6. 4. 上新了Spring,全新一代类型转换机制
  7. python图片转文字easyocr_Easy Screen OCR for Mac(文字识别转换工具)
  8. DR、BDR、SBR、ASBR等名词的解释和原理
  9. 回顾2022,展望2023,一个普通程序员的自述和分享
  10. Android 暗黑模式适配