pandas之样本操作
随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。
sample() 函数的语法格式如下:
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()。实例如下:
- import pandas as pd
- dict = {'name':["Jack", "Tom", "Helen", "John"],'age': [28, 39, 34, 36],'score':[98,92,91,89]}
- info = pd.DataFrame(dict)
- #默认随机选择两行
- info.sample(n=2)
- #随机选择两列
- info.sample(n=2,axis=1)
输出结果:
name age score
3 John 36 89
0 Jack 28 98 score name
0 98 Jack
1 92 Tom
2 91 Helen
3 89 John
再来看一组示例:
- import pandas as pd
- info = pd.DataFrame({'data1': [2, 6, 8, 0], 'data2': [2, 5, 0, 8], 'data3': [12, 2, 1, 8]}, index=['John', 'Parker', 'Smith', 'William'])
- info
- #随机抽取3个数据
- info['data1'].sample(n=3)
- #总体的50%
- info.sample(frac=0.5, replace=True)
- #data3序列为权重值,并且允许重复数据出现
- info.sample(n=2, weights='data3', random_state=1)
输出结果:
随机选择3行数据:
William 0
Smith 8
Parker 6
Name: data1, dtype: int64 data1 data2 data3
John 2 2 12
William 0 8 8 data1 data2 data3
John 2 2 12
William 0 8 8
---------------------------------------------------
数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下:
| 方法 | 说明 |
|---|---|
| 降采样 | 将高频率(间隔短)数据转换为低频率(间隔长)。 |
| 升采样 | 将低频率数据转换为高频率。 |
Pandas 提供了 resample() 函数来实现数据的重采样。
降采样
通过 resample() 函数完成数据的降采样,比如按天计数的频率转换为按月计数。
- import pandas as pd
- import numpy as np
- rng = pd.date_range('1/1/2021',periods=100,freq='D')
- ts = pd.Series(np.random.randn(len(rng)),index=rng)
- #降采样后并聚合
- ts.resample('M').mean()
输出结果:
2021-01-31 0.210353
2021-02-28 -0.058859
2021-03-31 -0.182952
2021-04-30 0.205254
Freq: M, dtype: float64
如果您只想看到月份,那么您可以设置kind=period如下所示:
ts.resample('M',kind='period').mean()
输出结果:
2021-01 -0.153121
2021-02 0.136231
2021-03 -0.238975
2021-04 -0.309502
Freq: M, dtype: float64
升采样
升采样是将低频率(时间间隔)转换为高频率,示例如下:
- import pandas as pd
- import numpy as np
- #生成一份时间序列数据
- rng = pd.date_range('1/1/2021', periods=20, freq='3D')
- ts = pd.Series(np.random.randn(len(rng)), index=rng)
- print(ts.head())
- #使用asfreq()在原数据基础上实现频率转换
- ts.resample('D').asfreq().head()
输出结果:
升采样前:
2021-01-01 0.608716
2021-01-04 1.097451
2021-01-07 -1.280173
2021-01-10 -0.175065
2021-01-13 1.046831
Freq: 3D, dtype: float64
升采样后:
2021-01-01 0.608716
2021-01-02 NaN
2021-01-03 NaN
2021-01-04 1.097451
2021-01-05 NaN
Freq: D, dtype: float64
频率转换
asfreq() 方法不仅能够实现频率转换,还可以保留原频率对应的数值,同时它也可以单独使用,示例如下:
- index = pd.date_range('1/1/2021', periods=6, freq='T')
- series = pd.Series([0.0, None, 2.0, 3.0,4.0,5.0], index=index)
- df = pd.DataFrame({'s':series})
- print(df.asfreq("45s"))
输出结果:
num
2021-01-01 00:00:00 0.0
2021-01-01 00:00:45 NaN
2021-01-01 00:01:30 NaN
2021-01-01 00:02:15 NaN
2021-01-01 00:03:00 3.0
2021-01-01 00:03:45 NaN
2021-01-01 00:04:30 NaN
插值处理
从上述示例不难看出,升采样的结果会产生缺失值,那么就需要对缺失值进行处理,一般有以下几种处理方式:
| 方法 | 说明 |
|---|---|
| pad/ffill | 用前一个非缺失值去填充缺失值。 |
| backfill/bfill | 用后一个非缺失值去填充缺失值。 |
| interpolater('linear') | 线性插值方法。 |
| fillna(value) | 指定一个值去替换缺失值。 |
下面使用插值方法处理 NaN 值,示例如下:
- import pandas as pd
- import numpy as np
- #创建时间序列数据
- rng = pd.date_range('1/1/2021', periods=20, freq='3D')
- ts = pd.Series(np.random.randn(len(rng)), index=rng)
- print(ts.resample('D').asfreq().head())
- #使用ffill处理缺失值
- ts.resample('D').asfreq().ffill().head()
输出结果:
2021-01-01 0.555580
2021-01-02 NaN
2021-01-03 NaN
2021-01-04 -0.079324
2021-01-05 NaN
Freq: D, dtype: float64 #插值处理,注意对比
2021-01-01 0.555580
2021-01-02 0.555580
2021-01-03 0.555580
2021-01-04 -0.079324
2021-01-05 -0.079324
Freq: D, dtype: float64
pandas之样本操作的更多相关文章
- (四)pandas的拼接操作
pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...
- pandas的apply操作
pandas的apply操作类似于Scala的udf一样方便,假设存在如下dataframe: id_part pred pred_class v_id 0 d [0.722817, 0.650064 ...
- Pandas的基础操作(一)——矩阵表的创建及其属性
Pandas的基础操作(一)——矩阵表的创建及其属性 (注:记得在文件开头导入import numpy as np以及import pandas as pd) import pandas as pd ...
- python数据结构:pandas(2)数据操作
一.Pandas的数据操作 0.DataFrame的数据结构 1.Series索引操作 (0)Series class Series(base.IndexOpsMixin, generic.NDFra ...
- Pandas的拼接操作
pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join import pandas as pd import n ...
- 数据分析05 /pandas的高级操作
数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...
- pandas 写csv 操作
pandas 写csv 操作 def show_history(self): df = pd.DataFrame() df['Time'] = pd.Series(self.time_hist) df ...
- 利用Python进行数据分析(15) pandas基础: 字符串操作
字符串对象方法 split()方法拆分字符串: strip()方法去掉空白符和换行符: split()结合strip()使用: "+"符号可以将多个字符串连接起来: join( ...
- 011 pandas的常见操作
一:对索引进行操作 1.reindex重新索引 pandas提供了一个方法来创建一个适应新索引的新对象. Series通过调用reindex方法会根据新的索引顺序重新排序,如果新的索引中存在原索引不存 ...
- pandas的聚合操作: groupyby与agg
pandas提供基于行和列的聚合操作,groupby可理解为是基于行的,agg则是基于列的 从实现上看,groupby返回的是一个DataFrameGroupBy结构,这个结构必须调用聚合函数(如su ...
随机推荐
- Leetcode209
209. Minimum Size Subarray Sum i , s , l = 0, 0, 0 for j in range(len(nums)): ...
- Executor框架详解
Executor框架详解 java的线程既是工作单元,也是执行机制.从jdk5开始,把工作单元与执行机制分离开来.工作单元包括Runnable和Callable,而执行机制由Executor框架提供. ...
- Python+Django(3)——创建主页
打开项目主文件夹learning_log中的文件urls.py: from django.contrib import admin from django.urls import path,re_pa ...
- vue 同一个子组件,两次赋值不同,dom不更新
转自:https://blog.csdn.net/WO_JIAMIFENG/article/details/115250918 <div :key="inputkey"> ...
- 十大经典排序之归并排序(C++实现)
归并排序 思路:(分而治之的思想) 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置: 3.比较两个指针所指向的元 ...
- ROM,RAM,内存
ROM是用来存放最基本的程序的,不是系统程序(windows),而是主板自带的最基本的程序, 无法被删除,更改.只能读取. 操作系统是放在硬盘里的,在开机时会在内存中加载,所以windows7比win ...
- SpringBoot为什么是默认单例的:
好处: 1)提升性能,减少了新生成实例的消耗 新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例, 其次,给对象分配内存也会涉及复杂算法,这些都是消耗性能的操作. ...
- FlexPaperViewer跨服务器\跨域访问swf不显示问题
做在线预览办公文档时,遇到了使用flexpaper访问文件服务器swf不显示问题. 假想1: swf文件有问题? 实验1: 直接访问swf文件在文件服务器的地址,浏览器可以正常访问,但是放在flexp ...
- Java新手问题 请问各路大佬这是什么问题导致的呢?
- Blog作业01
目录 前言 设计与分析 踩坑心得 改进建议 总结 前言 这三次作业的知识点覆盖的很全面,从最开始的int赋值变量,循环,到Boolean值,sort等一些函数,到后来的对象,类的创建和声明,gette ...