pandas groupby shift rank rolling 等用法详解

1.pandas shift

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(16).reshape(4,4),columns=['AA','BB','CC','DD'],index =['a','b','c','d'])
#https://blog.csdn.net/brucewong0516/article/details/80157639
df
AABBCCDD
a0123
b4567
c891011
d12131415

1.1 上下移动

df.shift(1)
AABBCCDD
aNaNNaNNaNNaN
b0.01.02.03.0
c4.05.06.07.0
d8.09.010.011.0
df.shift(-1)
AABBCCDD
a4.05.06.07.0
b8.09.010.011.0
c12.013.014.015.0
dNaNNaNNaNNaN

1.2 左右移动

df.shift(1,axis = 1)
AABBCCDD
aNaN0.01.02.0
bNaN4.05.06.0
cNaN8.09.010.0
dNaN12.013.014.0
df.shift(-2,axis = 1)
AABBCCDD
a2.03.0NaNNaN
b6.07.0NaNNaN
c10.011.0NaNNaN
d14.015.0NaNNaN

1.3 groupby 之后再shift,(分组之后再shift)

df = pd.DataFrame({'id':[1,1,1,2,2,3],'value':[1,2,3,4,5,6]})
df
idvalue
011
112
213
324
425
536
for k,v in df.groupby(['id'])['value']:
    print(k)
    print(v)
1
0    1
1    2
2    3
Name: value, dtype: int64
2
3    4
4    5
Name: value, dtype: int64
3
5    6
Name: value, dtype: int64
df.groupby(['id'])['value'].shift(1)
0    NaN
1    1.0
2    2.0
3    NaN
4    4.0
5    NaN
Name: value, dtype: float64

2.pandas rolling

  • rolling为滚动的意思
# https://www.jb51.net/article/151590.htm
df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
df
B
00.0
11.0
22.0
3NaN
44.0
  • 相当于统计的但是窗口为3的期间内,的和

  • window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。

  • min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。

  • center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。

df.rolling(3, min_periods=1).sum()
B
00.0
11.0
23.0
33.0
46.0
df.rolling(3, min_periods=2).sum()
B
0NaN
11.0
23.0
33.0
46.0
  • center相当于是滑动窗口的位置再最中间,然后来统计结果
df.rolling(3, min_periods=1, center=True).sum()
B
01.0
13.0
23.0
36.0
44.0
# A地有两个仓库,都运往B。
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
     '2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
     'num': [1,2,1,3,4,2,1]}, 
     index = [pd.Timestamp('20130101 09:00:00'),
       pd.Timestamp('20130101 09:00:01'),
       pd.Timestamp('20130101 09:00:02'),
       pd.Timestamp('20130101 09:00:03'),
       pd.Timestamp('20130101 09:00:04'),
       pd.Timestamp('20130101 09:00:05'),
       pd.Timestamp('20130101 09:00:06')])
df
12num
2013-01-01 09:00:00A1B11
2013-01-01 09:00:01A2B12
2013-01-01 09:00:02A1B11
2013-01-01 09:00:03A2B13
2013-01-01 09:00:04A2B14
2013-01-01 09:00:05A1B12
2013-01-01 09:00:06A2B11
for k,v in df.groupby(['1', '2'])['num']:
    print(k)
    print(v)
('A1', 'B1')
2013-01-01 09:00:00    1
2013-01-01 09:00:02    1
2013-01-01 09:00:05    2
Name: num, dtype: int64
('A2', 'B1')
2013-01-01 09:00:01    2
2013-01-01 09:00:03    3
2013-01-01 09:00:04    4
2013-01-01 09:00:06    1
Name: num, dtype: int64
df.groupby(['1', '2'])['num'].rolling('3s').sum()
1   2                      
A1  B1  2013-01-01 09:00:00    1.0
        2013-01-01 09:00:02    2.0
        2013-01-01 09:00:05    2.0
A2  B1  2013-01-01 09:00:01    2.0
        2013-01-01 09:00:03    5.0
        2013-01-01 09:00:04    7.0
        2013-01-01 09:00:06    5.0
Name: num, dtype: float64

3.pandas rank

list1 = [1, 3, 1,0,7,4,0]
list2 = [3, 3, 2,0,4,4,5]
list3 = [3, 3, 3,3,4,4,6]
df1 = pd.DataFrame({'col1':list1,'col2':list2,'col3':list3})
print(df1)
   col1  col2  col3
0     1     3     3
1     3     3     3
2     1     2     3
3     0     0     3
4     7     4     4
5     4     4     4
6     0     5     6
df1=df1.set_index('col2')
df1
col1col3
col2
313
333
213
003
474
444
506
for k,v in df1.groupby(['col3']):
    print(k)
    print(v)
3
      col1  col3
col2            
3        1     3
3        3     3
2        1     3
0        0     3
4
      col1  col3
col2            
4        7     4
4        4     4
6
      col1  col3
col2            
5        0     6
  • 就是看分组了之后,这个数在这个组里面排第几,是按从小到大排列还是从大到小排列
df1 = df1.groupby(['col3']).rank(method='min',ascending=False)
df1
col1
col2
32.0
31.0
22.0
04.0
41.0
42.0
51.0
df1 = df1.groupby(['col3']).rank(method='max',ascending=False)
df1
col1
col2
33.0
31.0
23.0
04.0
41.0
42.0
51.0
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
pandas中的groupby函数用于按照指定的列对数据集进行分组,并对每个分组进行特定的操作。groupby函数的基本语法为: ```python df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs) ``` 其中,by参数用于指定分组依据的列名或列名列表;axis参数用于指定分组的轴向,默认为0,表示按照行进行分组;level参数用于多层索引时指定分组的级别;as_index参数用于指定分组后的结果是否以分组列作为索引;sort参数用于指定分组后的结果是否按照分组列排序;group_keys参数用于指定是否在分组后的结果中保留分组键;squeeze参数用于指定是否在分组后的结果中压缩单一分组的维度。 groupby函数返回的是一个GroupBy对象,可以对该对象进行多种操作,例如聚合、过滤、变换等。常用的聚合函数包括sum、mean、count、max、min等。groupby函数的原理是先将数据按照行或列进行分组,然后对每个分组进行特定的操作,并将结果合并成一个新的数据集。在实现上,groupby函数使用了split-apply-combine的策略,即先将数据集拆分成多个小组,然后对每个小组进行操作,最后将结果合并成一个新的数据集。 需要注意的是,groupby函数并不会改变原始的数据集,而是返回一个新的数据集,因此在使用groupby函数时需要注意将结果保存到变量中。另外,groupby函数对于大型数据集的性能较低,因此在处理大型数据集时需要谨慎使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值