赞
踩
window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。
min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。
freq:从0.18版本中已经被舍弃。
center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。
win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里。
on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。
closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。
axis:方向(轴),一般都是0。
DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
rolling 方法其实就在固定一个window,这样你就可以在这个window做sum, mean.等等
例子
import pandas as pd import numpy as np index = pd.date_range('2019-01-01', periods=5) # 创建日期序列 data = pd.DataFrame(np.arange(len(index)), index=index, columns=['test']) # 创建简单的pd.DataFrame print(data) # 打印data data['sum'] = data.test.rolling(3).sum() print('-----') print(data['sum']) # 移动3个值,进行求和 data['mean'] = data.test.rolling(3).mean() print('-----') print(data['mean'] ) # 移动3个值,进行求平均数 data['mean1'] = data.test.rolling(3, min_periods=2).mean() print('-----') print(data['mean1'] )
test 2019-01-01 0 2019-01-02 1 2019-01-03 2 2019-01-04 3 2019-01-05 4 ----- 2019-01-01 NaN 2019-01-02 NaN 2019-01-03 3.0 2019-01-04 6.0 2019-01-05 9.0 Freq: D, Name: sum, dtype: float64 ----- 2019-01-01 NaN 2019-01-02 NaN 2019-01-03 1.0 2019-01-04 2.0 2019-01-05 3.0 Freq: D, Name: mean, dtype: float64 ----- 2019-01-01 NaN 2019-01-02 0.5 2019-01-03 1.0 2019-01-04 2.0 2019-01-05 3.0 Freq: D, Name: mean1, dtype: float64 Process finished with exit code 0
pandas.cut用来把一组数据分割成离散的区间。比如有一组年龄数据,可以使用pandas.cut将年龄数据分割成不同的年龄段并打上标签。
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise') #0.23.4
x:被切分的类数组(array-like)数据,必须是1维的(不能用DataFrame);
bins:bins是被切割后的区间(或者叫“桶”、“箱”、“面元”),有3中形式:一个int型的标量、标量序列(数组)或者pandas.IntervalIndex 。
一个int型的标量
当bins为一个int型的标量时,代表将x平分成bins份。x的范围在每侧扩展0.1%,以包括x的最大值和最小值。
标量序列
标量序列定义了被分割后每一个bin的区间边缘,此时x没有扩展。
pandas.IntervalIndex
定义要使用的精确区间。
right:bool型参数,默认为True,表示是否包含区间右部。比如如果bins=[1,2,3],right=True,则区间为(1,2],(2,3];right=False,则区间为(1,2),(2,3)。
labels:给分割后的bins打标签,比如把年龄x分割成年龄段bins后,可以给年龄段打上诸如青年、中年的标签。labels的长度必须和划分后的区间长度相等,比如bins=[1,2,3],划分后有2个区间(1,2],(2,3],则labels的长度必须为2。如果指定labels=False,则返回x中的数据在第几个bin中(从0开始)。
retbins:bool型的参数,表示是否将分割后的bins返回,当bins为一个int型的标量时比较有用,这样可以得到划分后的区间,默认为False。
precision:保留区间小数点的位数,默认为3.
include_lowest:bool型的参数,表示区间的左边是开还是闭的,默认为false,也就是不包含区间左部(闭)。
duplicates:是否允许重复区间。有两种选择:raise:不允许,drop:允许。
out:一个pandas.Categorical, Series或者ndarray类型的值,代表分区后x中的每个值在哪个bin(区间)中,如果指定了labels,则返回对应的label。
bins:分隔后的区间,当指定retbins为True时返回。
这里拿给年龄分组当做例子。
import numpy as np
import pandas as pd
ages = np.array([1,5,10,40,36,12,58,62,77,100]) #年龄数据
将ages平分成5个区间
r1 = pd.cut(ages, 5)
print(r1)
输出:
[(0.901, 20.8], (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], (0.901, 20.8], (40.6, 60.4], (60.4, 80.2], (60.4, 80.2], (80.2, 100.0]]
Categories (5, interval[float64]): [(0.901, 20.8] < (20.8, 40.6] < (40.6, 60.4] < (60.4, 80.2] <
(80.2, 100.0]]
可以看到ages被平分成5个区间,且区间两边都有扩展以包含最大值和最小值。
将ages平分成5个区间并指定labels
r2 = pd.cut(ages, 5, labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
print(r2)
输出
[婴儿, 婴儿, 婴儿, 青年, 青年, 婴儿, 中年, 壮年, 壮年, 老年]
Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]
给ages指定区间进行分割
r3 = pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
print(r3)
[婴儿, 婴儿, 青年, 壮年, 壮年, 青年, 老年, 老年, 老年, 老年]
Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]
这里不再平分ages,而是将ages分为了5个区间(0, 5],(5, 20],(20, 30],(30,50],(50,100].
返回分割后的bins
令retbins=True即可
r4 = pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"],retbins=True)
print(r4)
([婴儿, 婴儿, 青年, 壮年, 壮年, 青年, 老年, 老年, 老年, 老年]
Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年], array([ 0, 5, 20, 30, 50, 100]))
只返回x中的数据在哪个bin
令labels=False即可
r5 = pd.cut(ages, [0,5,20,30,50,100], labels=False)
[0 0 1 3 3 1 4 4 4 4]
第一个0表示1在第0个bin中。
改列表名字
data = pd.DataFrame(ages, columns=['test'])
r6 = pd.cut(data['test'], [0,5,20,30,50,100], labels=False)
print(r6)
print(r6.rename('s'))
0 0 1 0 2 1 3 3 4 3 5 1 6 4 7 4 8 4 9 4 Name: test, dtype: int64 0 0 1 0 2 1 3 3 4 3 5 1 6 4 7 4 8 4 9 4 Name: s, dtype: int64 <class 'pandas.core.series.Series'> Process finished with exit code 0
https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.cut.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。