随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。

sample() 函数的语法格式如下:

  1. DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

参数说明如下表所示:

参数名称 参数说明
n 表示要抽取的行数。
frac 表示抽取的比例,比如 frac=0.5,代表抽取总体数据的50%。
replace 布尔值参数,表示是否以有放回抽样的方式进行选择,默认为 False,取出数据后不再放回。
weights 可选参数,代表每个样本的权重值,参数值是字符串或者数组。
random_state 可选参数,控制随机状态,默认为 None,表示随机数据不会重复;若为 1 表示会取得重复数据。
axis 表示在哪个方向上抽取数据(axis=1 表示列/axis=0 表示行)。

该函数返回与数据集类型相同的新对象,相当于 numpy.random.choice()。实例如下:

  1. import pandas as pd
  2. dict = {'name':["Jack", "Tom", "Helen", "John"],'age': [28, 39, 34, 36],'score':[98,92,91,89]}
  3. info = pd.DataFrame(dict)
  4. #默认随机选择两行
  5. info.sample(n=2)
  6. #随机选择两列
  7. info.sample(n=2,axis=1)

输出结果:

  1. name age score
  2. 3 John 36 89
  3. 0 Jack 28 98
  4.  
  5. score name
  6. 0 98 Jack
  7. 1 92 Tom
  8. 2 91 Helen
  9. 3 89 John

再来看一组示例:

  1. import pandas as pd
  2. info = pd.DataFrame({'data1': [2, 6, 8, 0], 'data2': [2, 5, 0, 8], 'data3': [12, 2, 1, 8]}, index=['John', 'Parker', 'Smith', 'William'])
  3. info
  4. #随机抽取3个数据
  5. info['data1'].sample(n=3)
  6. #总体的50%
  7. info.sample(frac=0.5, replace=True)
  8. #data3序列为权重值,并且允许重复数据出现
  9. info.sample(n=2, weights='data3', random_state=1)

输出结果:

  1. 随机选择3行数据:
  2. William 0
  3. Smith 8
  4. Parker 6
  5. Name: data1, dtype: int64
  6.  
  7. data1 data2 data3
  8. John 2 2 12
  9. William 0 8 8
  10.  
  11. data1 data2 data3
  12. John 2 2 12
  13. William 0 8 8
    ---------------------------------------------------
    数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下:

方法 说明
降采样 将高频率(间隔短)数据转换为低频率(间隔长)。
升采样 将低频率数据转换为高频率。

  1. Pandas 提供了 resample() 函数来实现数据的重采样。

降采样

  1. 通过 resample() 函数完成数据的降采样,比如按天计数的频率转换为按月计数。
  1. import pandas as pd
  2. import numpy as np
  3. rng = pd.date_range('1/1/2021',periods=100,freq='D')
  4. ts = pd.Series(np.random.randn(len(rng)),index=rng)
  5. #降采样后并聚合
  6. ts.resample('M').mean()
  1. 输出结果:
  1. 2021-01-31 0.210353
  2. 2021-02-28 -0.058859
  3. 2021-03-31 -0.182952
  4. 2021-04-30 0.205254
  5. Freq: M, dtype: float64
  1. 如果您只想看到月份,那么您可以设置kind=period如下所示:
  1. ts.resample('M',kind='period').mean()
  1. 输出结果:
  1. 2021-01 -0.153121
  2. 2021-02 0.136231
  3. 2021-03 -0.238975
  4. 2021-04 -0.309502
  5. Freq: M, dtype: float64

升采样

  1. 升采样是将低频率(时间间隔)转换为高频率,示例如下:
  1. import pandas as pd
  2. import numpy as np
  3. #生成一份时间序列数据
  4. rng = pd.date_range('1/1/2021', periods=20, freq='3D')
  5. ts = pd.Series(np.random.randn(len(rng)), index=rng)
  6. print(ts.head())
  7. #使用asfreq()在原数据基础上实现频率转换
  8. ts.resample('D').asfreq().head()
  1. 输出结果:
  1. 升采样前:
  2. 2021-01-01    0.608716
  3. 2021-01-04    1.097451
  4. 2021-01-07   -1.280173
  5. 2021-01-10   -0.175065
  6. 2021-01-13    1.046831
  7. Freq: 3D, dtype: float64
  8. 升采样后:
  9. 2021-01-01    0.608716
  10. 2021-01-02         NaN
  11. 2021-01-03         NaN
  12. 2021-01-04    1.097451
  13. 2021-01-05         NaN
  14. Freq: D, dtype: float64

频率转换

  1. asfreq() 方法不仅能够实现频率转换,还可以保留原频率对应的数值,同时它也可以单独使用,示例如下:
  1. index = pd.date_range('1/1/2021', periods=6, freq='T')
  2. series = pd.Series([0.0, None, 2.0, 3.0,4.0,5.0], index=index)
  3. df = pd.DataFrame({'s':series})
  4. print(df.asfreq("45s"))
  1. 输出结果:
  1. num
  2. 2021-01-01 00:00:00 0.0
  3. 2021-01-01 00:00:45 NaN
  4. 2021-01-01 00:01:30 NaN
  5. 2021-01-01 00:02:15 NaN
  6. 2021-01-01 00:03:00 3.0
  7. 2021-01-01 00:03:45 NaN
  8. 2021-01-01 00:04:30 NaN

插值处理

  1. 从上述示例不难看出,升采样的结果会产生缺失值,那么就需要对缺失值进行处理,一般有以下几种处理方式:

方法 说明
pad/ffill 用前一个非缺失值去填充缺失值。
backfill/bfill 用后一个非缺失值去填充缺失值。
interpolater('linear') 线性插值方法。
fillna(value) 指定一个值去替换缺失值。

  1. 下面使用插值方法处理 NaN 值,示例如下:
  1. import pandas as pd
  2. import numpy as np
  3. #创建时间序列数据
  4. rng = pd.date_range('1/1/2021', periods=20, freq='3D')
  5. ts = pd.Series(np.random.randn(len(rng)), index=rng)
  6. print(ts.resample('D').asfreq().head())
  7. #使用ffill处理缺失值
  8. ts.resample('D').asfreq().ffill().head()
  1. 输出结果:
  1. 2021-01-01 0.555580
  2. 2021-01-02 NaN
  3. 2021-01-03 NaN
  4. 2021-01-04 -0.079324
  5. 2021-01-05 NaN
  6. Freq: D, dtype: float64
  7.  
  8. #插值处理,注意对比
  9. 2021-01-01 0.555580
  10. 2021-01-02 0.555580
  11. 2021-01-03 0.555580
  12. 2021-01-04 -0.079324
  13. 2021-01-05 -0.079324
  14. Freq: D, dtype: float64

pandas之样本操作的更多相关文章

  1. (四)pandas的拼接操作

    pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...

  2. pandas的apply操作

    pandas的apply操作类似于Scala的udf一样方便,假设存在如下dataframe: id_part pred pred_class v_id 0 d [0.722817, 0.650064 ...

  3. Pandas的基础操作(一)——矩阵表的创建及其属性

    Pandas的基础操作(一)——矩阵表的创建及其属性 (注:记得在文件开头导入import numpy as np以及import pandas as pd) import pandas as pd ...

  4. python数据结构:pandas(2)数据操作

    一.Pandas的数据操作 0.DataFrame的数据结构 1.Series索引操作 (0)Series class Series(base.IndexOpsMixin, generic.NDFra ...

  5. Pandas的拼接操作

    pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join import pandas as pd import n ...

  6. 数据分析05 /pandas的高级操作

    数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...

  7. pandas 写csv 操作

    pandas 写csv 操作 def show_history(self): df = pd.DataFrame() df['Time'] = pd.Series(self.time_hist) df ...

  8. 利用Python进行数据分析(15) pandas基础: 字符串操作

      字符串对象方法 split()方法拆分字符串: strip()方法去掉空白符和换行符: split()结合strip()使用: "+"符号可以将多个字符串连接起来: join( ...

  9. 011 pandas的常见操作

    一:对索引进行操作 1.reindex重新索引 pandas提供了一个方法来创建一个适应新索引的新对象. Series通过调用reindex方法会根据新的索引顺序重新排序,如果新的索引中存在原索引不存 ...

  10. pandas的聚合操作: groupyby与agg

    pandas提供基于行和列的聚合操作,groupby可理解为是基于行的,agg则是基于列的 从实现上看,groupby返回的是一个DataFrameGroupBy结构,这个结构必须调用聚合函数(如su ...

随机推荐

  1. mapboxGL2离线化应用

    https://blog.csdn.net/GISShiXiSheng/article/details/120300679?spm=1001.2014.3001.5501

  2. swagger接口测试

    导入依赖:<!-- swagger start --><dependency> <groupId>io.springfox</groupId> < ...

  3. CvT: Introducing Convolutions to Vision Transformers-首次将Transformer应用于分类任务

    CvT: Introducing Convolutions to Vision Transformers Paper:https://arxiv.org/pdf/2103.15808.pdf Code ...

  4. LOJ数列分块入门九题(中)

    #6281. 数列分块入门 5 - 题目 - LibreOJ (loj.ac) 区间开方,区间求和题. 显然,针对区间维护开方操作很难做到,于是考虑其值的性质,显然,int范围内的值最多开方6次就会变 ...

  5. 常用功能系列---【JWT生成Token实现接口登录认证方案思路】

    JWT生成Token实现接口登录认证方案思路 方案一(双token实现无感刷新) 在token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录,跳转至登录页面. 但是 ...

  6. Java中继承相关知识点

    继承 1.继承概述 继承是面向对象的三大特征之一.可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法 1.1 继承的格式 格式:public class 子类名 extends ...

  7. springboot 注解属性配置

    参考: https://blog.csdn.net/ouyangguangfly/article/details/106646378 https://www.cnblogs.com/cbzj/p/94 ...

  8. 【Docker】Postgres 安装

    1.docker pull postgres 2.docker run --name postgres -v /home/postgre/data:/var/lib/postgresql/data - ...

  9. vite+vue3使用unplugin-auto-import 无需手动引入api!

    近期了解到unplugin-auto-import这个插件 用途是无需每个组件内重复的引入vue vue-router等内置方法 下面举个例子 <script setup> import ...

  10. pntia7-7 软硬车厢交替排列 (40 分)

    7-7 软硬车厢交替排列 (40 分) 设车辆厂生产了硬座车厢和软座车厢共n节(混合在一起),要求使用队列的基本操作,编程实现所有硬座车厢和所有软座车厢交替排列. 例如硬座车厢用H来表示,软座车厢用S ...