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长度不必和字典长度相同
通过字典创建Series对象的两个特点: 
  • 在默认情况下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()) # 填充平均值
复制代码

 

posted @   是余是我  阅读(334)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示