当前位置:   article > 正文

[pandas]方法总结_pandas.cut closed

pandas.cut closed

pandas.rolling 方法

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)
  • 1

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'] )

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
            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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

pandas.cut 方法

用途

pandas.cut用来把一组数据分割成离散的区间。比如有一组年龄数据,可以使用pandas.cut将年龄数据分割成不同的年龄段并打上标签。

原型

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise') #0.23.4
  • 1

参数含义

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]) #年龄数据
  • 1
  • 2
  • 3
  • 4

将ages平分成5个区间

r1 = pd.cut(ages, 5)
print(r1)
  • 1
  • 2

输出:

[(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]]
  • 1
  • 2
  • 3

可以看到ages被平分成5个区间,且区间两边都有扩展以包含最大值和最小值。

将ages平分成5个区间并指定labels

r2 = pd.cut(ages, 5, labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
print(r2)
  • 1
  • 2

输出

[婴儿, 婴儿, 婴儿, 青年, 青年, 婴儿, 中年, 壮年, 壮年, 老年]
Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]
  • 1
  • 2

给ages指定区间进行分割

r3 = pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
print(r3)
  • 1
  • 2
[婴儿, 婴儿, 青年, 壮年, 壮年, 青年, 老年, 老年, 老年, 老年]
Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]
  • 1
  • 2

这里不再平分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)
  • 1
  • 2
([婴儿, 婴儿, 青年, 壮年, 壮年, 青年, 老年, 老年, 老年, 老年]
Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年], array([  0,   5,  20,  30,  50, 100]))
  • 1
  • 2

只返回x中的数据在哪个bin
令labels=False即可

r5 =  pd.cut(ages, [0,5,20,30,50,100], labels=False)
  • 1
[0 0 1 3 3 1 4 4 4 4]
  • 1

第一个0表示1在第0个bin中。

pandas.rename 方法

改列表名字

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'))
  • 1
  • 2
  • 3
  • 4
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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

参考

https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.cut.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/846714
推荐阅读
  

闽ICP备14008679号