Pandas
http://pandas.pydata.org/pandasdocs/stable/cookbook.html#cookbook
Pandas为 NumPy的扩展,NumPy具备的很多功能 pandas 相应地也具备.
Pandas有两个数据类型: Series(相当于一维数据类型)和DataFrame(二维到多维的数据类型)
基于上述数据类型的各类操作有:
基本操作, 运算操作, 特征类操作, 关联类操作
NumPy与Pandas的区别
NumPy: 基础数据类型; 关注数据结构(维度)的表达; 维度, 数据间关系
Pandas: 扩展数据类型; 关注数据的应用表达(提取, 运算); 数据与索引间关系
摘自:weihuchao
Series对象
Series是Pandas中最基本的对象,类似于一维数组的对象,由一 组数据和一组与之相关的数据标签(索引)组成,主要处理时间序 列相关的数据。和一维数据最主要区别Series类型具有索引 (index)对象
创建方法1: 通过list创建Series对象
通过Pandas Series (data, index=index, name =name)方 法来实现Series对象创建,其中 data参数为Series对象中的 值,index为Series的索引,name为 Series的名称
1 price _ series = pd. Series ( price, index = [ 'apple', 'orange’,'grape’,’pear’,’,pitaya']) 2 price = [1.1,1.2,1.3,1.4,1.5] 3 price_series=pd. Series(price) 4 price_series. index 5 price_series. values 6 price_series.name 7 price_ series=pd. Series (price, index = [ 'apple', 'orange', 'grape', 'pear', 'pitaya '],name = 'fruits_price’)
声明Seires 对象时,默认从零开 始依次递增的值作为标签,这种情况下这一列标签与数组 或列表中的下标是一致的。
Series对象在创建时可通过 index 参数指定有意义的标签, 用于区分和识别每个元素,这样在访问元素时就不用知道对 应元素的顺序了
把 Series 对象看成由两个数组组成,前面的数组称为索 引,后面的数组称为 Series 对象的值。
创建方法2:通过Python字典对象(dict)创建Series对象
1 fruit _ price_ dict = {‘apple’:1.1, 'orange’: 1.2, Γ ‘grape’: 1.3, 'pear' : 1. 4,’pitaya’: 1.5} 2 price_ series=pd.Series (fruit_price_dict) 3 price_ series=pd.Series (fruit_price _dict, index = [ 'apple’,’pear’,’banana’]) # 通过字典创建 Series, index长度不必和字典长度相同
- 在默认情况下keys会变成Series对象的索引,values会 变成Series对象的值。
- index长度可以和字典长度不同。数据会按index的顺序 重新排列,如果index多,Pandas将自动为多余的index 分配NaN(Not a Number,pandas中数据缺失的标 准);如果index少,就截取对应部分的字典内容
创建方法3:通过使用 NumPy数组创建一个新的 Series对象
1 arr= np. arange (0,6) # 创建 ndarray类型对象 2 ser1= pd. Series (arr)
创建方法4: 通过一个 Series 对象生成另一个 Series 对象
1 ser2= pd. Series (ser1) 2 arr[0]=100 3 print(ser1) 4 print(ser2)
通过ndarray类型或者Series类型创建Series对象的特点:
创建的新 Series 对象并不是新的副本,而是对原来的 ndarray 类型对象或 Series 类型对象的一个引用。即当原 来的ndarray 类型对象或Series 类型对象发生改变时,新的Series类型对象也会发生相应的改变。修改通过引用创建的 Series,其引用的 Series 对象和 ndarray 类型对象值对应地发生改变。
Series数据的访问
多个标签访问多个元素:
- price_ series[[0,1,2]]
- price_ series[ [ 'apple', 'orange ’,’grape’ ]]
下标切片的方式访问:
- price_ series[0:2]
- price_ series[ [ ‘apple’:’grape’ ]]
Series的切片和列表的切片的不同:
- Series切片支持使用字符串切片,在使用字符串切片时, 数据包含切片末尾索引所对应的值。
- Series 的值可以改变,可通过索引进行赋值。
修改元素:
- 通过索引修改多个 Series 元素:price_series[ [‘apple’,'orange' ,'grape']]=[101,102,103]
- 通过切片以及常量赋值:price_series[ :]=1
Series元素的判断和过滤
1 # 判断 Series 对象中的元素是否大于3 2 print(s>3) 3 ''' 4 apple False 5 orange False 6 grape False 7 pear False 8 pitaya True 9 dtype: bool 10 ''' 11 # 过滤Series对象中大于3的元素 12 print(s[s >3]) 13 ''' 14 pitaya 4 15 dtype: int64 16 '''
Series元素的组成
Series 对象中一般会包含重复元素,判断某一个元素出 现的次数或判断某个元素是否在 Series 中,可通过 unique()、 value_counts()、 isin()等函数便可实现.
- unique()函数可对 Series 对象中的元素进行去重操作, 其返回结果是一个ndarray 类型对象,包含 Series 对象 中去重后的元素.
- value_ counts()函数可统计Series对象中每个元素出现 的次数。可实现元素的去重操作和统计每个元素的出现 次数。
- isin()函数可判断 Series 对象中的元素是否在某一个集 合,其返回结果是一个bool类型的Series对象。 isin()函数也可用于过滤 Series 数据 isin()函数判断元素是否在Series对象的集合中
Pandas中使用 NA或者 NaN表示缺失数据。 Pandas 使用 isnull()方法或者notnull()方法分别来检测 Series 中的缺失数据或非缺失数据.
DataFrame对象
- DataFrame可看成多个Series按列合并而成的二维数据结构,每一列单独取出来为一个Series对象。
- DataFrame对象的数据结构跟excel表相似,其目的是将 Series的使用场景由一维扩展到多维,它由按一定顺序排 列的多列数据组成,各列的数据类型可以有所不同。
- DataFrame可理解为一个由Series组成的字典,其中每一 列的名称作为字典的键,形成DataFrame列的Series作为 字典的值,每个Series的所有元素映射到称为index的标签数组中。
创建DataFrame
- DataFrame是一个 基于二维表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字 符串、布尔值等)。
- DataFrame对象有两个索引数组(行索引 index 和列索引 columns),第一个数组index与行相关,它与 Series的索引数组极为相似,每个索引值都跟所在的一行相关联;第二个数组columns包含一系列列标签(每 个值相当于列名)。
- 创建 DataFrame 实例可以使用 Pandas. DataFrame构 造函数,三个常用参数 :
- data:取数格式,常用输入类型有 dict、ndarray 、list、 series等。
- index:行标签。
- columns:列标签
创建方法1: 通过值是数组的字典创建DataFrame对象
字典里面各个数组的长度需要相同;DataFrame 未指定 index 参数时,会自动加上索引(与 Series一样),且列会被有序排列。
1 stu_dict = {'name : [ ‘张三’, ’李四’,’ 王五’,’小明’],'stuNo':[1,2,3,4] 2 stu_df=pd. DataFrame ( stu_dict, index=[ 'a','b','c', 'd']) 3 print(stu_df) 4 ''' 5 name stuNo 6 a 张三 1 7 b 李四 2 8 c 王五 3 9 d 小明 4 10 '''
创建方法2: 通过数组的方式创建 DataFrame 对象
通过数组的方式创建 DataFrame 对象,数组中的元素是字典类型.
1 stu_ dict = [{‘name':’张三 ’,’stuNo': 1}, 2 {'name’:,’李四’ ,'stuNo’2} 3 {'name‘:,’王五’ ,’stuNo':3} 4 {‘name’:,’小明 ','stuNo‘:4}] 5 stu _ df = pd. DataFrame ( stu_dict)
创建方法3: 通过 Series对象来构建DataFrame对象
Series能够保存任何类型数据(整数、字符串、浮点数、 Python 对象等)。DataFrame 中又可以将Series 理解为 “一列数据” 。
1 stu_ names = pd.Series([{’张三’,’李四’,’王五’,’小明’],index=[1,2,3,5]) 2 stu_ nos=pd.Series ([1, 2, 3, 4], index = [1,2,3,5]) 3 stu _ dict = { 'name ’: stu_ names, 'stuNo': stu_ nos} 4 stu_df = pd. DataFrame( stu _dict) 5 print(stu_ df) 6 ''' 7 name stuNo 8 a 张三 1.0 9 b 李四 2.0 10 c 王五 3.0 11 d 小明 NaN 12 e NaN 4.0 13 '''
创建方法4:使 用 concat 函数基于 Series 或者 DataFrame 建一个 DataFrame对象
1 stu _ name = pd. Series([‘张三’,’李四’,’王五’,’小明’] 2 stu_ no = pd. Series ( [1, 2, 3, 4]) 3 stu_df = pd. concat ([ stu_ name, stu _ no] , axis = 1) 4 print(stu_ df) 5 ''' 6 name stuNo 7 a 张三 1 8 b 李四 2 9 c 王五 3 10 d 小明 4 11 '''
axis=1表示按列合并,而axis=0表示按行合并,并且Series 都处理成列。
通过columns 参数指定 DataFrame 的列名
1 pd.DataFrame (np. arange (16). reshape (4,4), 2 index =[ 'row1', 'row2','row3','row4'], 3 columns =["col1","col2","col3","col4" ]) 4 col1 col2 col3 col4 5 row1 0 1 2 3 6 row2 4 5 6 7 7 row3 8 9 10 11 8 row4 12 13 14 15
DataFrame数据的访问
DataFrame常用的获取不同列数据的两个方式:
- 通过Dataname.column_name 选取列,只能选取一列
- 通过 DataFrame [column_name]选取列,可以选择多列。
- 若 DataFrame无列名,可使用非负整数即“下标”选取列;若有列名,则必须使用列名选取。 注意:DataFrame.column_name在没有列名的时候是无效的。
1 df.col1 2 df[’col1’] 3 df[’col1’, ’col2’] 4 df[’col1’][’row1’] # 先列再行
DataFrame数据查看
- Index对象是不可变的,用户不能对其修改。
- 不可变性使index对象在多个数据结构之间安全共享。
Series对象的idxmin()和idxmax函数分别返回最小值和最大值的索引
rename()函数修改列名,drop()删除无用的索引,其返回值已删除索引之后的新对象
索引常用是方法和属性
DataFrame数据的选取和过滤
通过索引和切片方式来获取数据
索引方式选择一个单独的列,返回一个Series,df['A']等同于df.A
切片方式 df[0:3或df['20130102':'20130104']
通过loc、iloc或者ix获取数据
loc是轴标签;iloc是使用整数索引,ix可以混合使用索 引和下标选择行和列子集
通过iloc函数传递数值进行位置选择(选择的是行)
df.iloc[3] df.iloc[3:5,0:2]
Pandas数据加载
读取CSV文件中的数据
使用read_csv函数读取文件。 可以实现从文件、URL、文件型对象中加载带分隔符的 数据,默认分隔符是逗号。
1 import pandas as pd 2 data_path =r"F:\joyful-pandas-master\data\my_csv.csv" 3 data = pd.read_csv(data_path) 4 print(data)
使用read_table函数读取文件。 可以实现从文件、URL、文件型对象中加载带分隔符的 数据,默认分隔符是制表符。
1 import pandas as pd 2 data_path =r"F:\joyful-pandas-master\data\my_csv.csv" 3 data = pd.read_table(data_path, sep=”,”) 4 print(data)
在处理很大的文件时,要找出大文件中的某一数据集以 便于后续处理,可考虑读取文件的一小部分或逐块对文件进 行迭代。如果只想读取几行(避免读取整个文件),通过 nrows进行指定即可。
要逐块读取文件,可以指定chunksize(行数)。read_csrv所返回的TextParser 对象可以根据chunksize对 文件进行逐块迭代。
1 df = pd. read_ csv ( path, nrows =5) 2 block=pd.read_csv(path,chunksize=20)
读取JSON数据
JSON和Python 中的字典数据结构非常相似,对象中所有的 键都必领是字符串,但是存在空值 null和一些其他的细微差 别(如列表未尾不允许存在多余的逗号)。
pandas.read_json()
- json. loads 即可将JSON 字符串转换成 Python 字典。
- json.dumps可将Python对象转换成JSON格式。
- pandas.read_json 方法可将 一 个 JSON 字符串转换为 DataFrame 或其他便于分析的数据结构。
- Dataframe.to_json()将一个 DataFrame 转换为 JSON 字符串。
- python中的很多对象都可以序列化成JSON 字符串
- Pandas 中的 DataFrame 对象也的以序列化成 JSON字符串, JSON 字符串也可以反序列化为DataFrame对象。
将数据写入CSV文件
1 df.to_csv('foo.csv‘) # 写入csv文件 2 pd.read_csv('foo.csv') # 从csv文件中读取 3 df.to_hdf('foo.h5','df') # 写入HDF5存储 4 pd.read_hdf('foo.h5','df') # 从HDF5存储中读取 5 df.to_excel('foo.xlsx', sheet_name='Sheet1') # 写入excel文件 6 pd.read_excel('foo.xlsx', 'Sheet1', 7 index_col=None, na_values=['NA']) # 从excel文件中读取
Pandas数据预处理
Python中的 “空”的概念:如很多函数没有返回值,实际上函数返回了 None,Python 中经常使用 None 表示“空”这 个对象, “空”并不是什么都没有, “空”也是一个对象。
Pandas 中“空” 的概念,Pandas 可以使用三类值作为缺失值,分别为 None、NaN、NA。
- None: Python对象类型的缺失值,使用df.isnull()进行判断 是否为空值
- NaN(Not a Number): 数值类型的缺失数据。NaN是一 种特殊的浮点数,不是整数、字符串或者其他数据类型
- NA(not available):pandas会将没有标签值的数据类型自动转换为NA
在pandas中, NaN和None这两者是等价交换的,在适当的时候,会将两者进行替换。
Pandas提供了探索、删除和替换数组里的缺失值的方法:
- isnull(): 创建一个布尔类型的标签缺失值
- notnull(): 创建一个布尔类型的标签缺失值,得到的结果和上 面恰好相反
- dropna():返回一个删除缺失值之后的数据
- fillna():返回一个使用某一个值或者某一些值填充之后的数据副本。
缺失值处理
1 data = pd.Series([1,2,np.nan,None]) 2 1、发现缺失值: 3 isnull()/isna() # 缺失值为True,不是缺失值为False,返回一个掩码 4 例:data.isnull() 5 或 pd.isnull(data) 6 notnull()/notna() # 不是缺失值为True,缺失值为False,返回一个掩码 7 例:data.notnull() 8 或 pd.notnull(data) 9 2、剔除缺失值:dropna(axis=0/1, # 按行删除/按列删除 10 how='any'/'all' # any:只要有一个缺失值就删除;all:该行/列所有都是缺失值,才删除 11 thresh=3(可以比较的数) # 行/列至少有3个有效值的就保留,其余删除 12 ) 13 data.dropna()返回一个删除过后的数据,原数据没变。 14 3、填充缺失值:fillna(method='ffill'/'bfill', # ffill向前填充。bfill向后填充。 15 axis=0/1 # 按行/列进行填充 16 ) 17 data.fillna(0) # 填充0 18 data.fillna(method='ffill') # 按列,向前进行填充 19 data.fillna(method='bfill',axis=1) # 按照行,向后进行填充 20 data.fillna(data.mean()) # 填充平均值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)