详解pd.Grouper()以及时间分组groupby()

1.pd.Grouper

arrays = [
    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
    ["one", "two", "one", "two", "one", "two", "one", "two"],
]
index = pd.MultiIndex.from_arrays(arrays, names=["first", "second"])
df = pd.DataFrame({"A": [1, 1, 1, 1, 2, 2, 3, 3], "B": np.arange(8)}, index=index)
df
Out[53]: 
              A  B
first second      
bar   one     1  0
      two     1  1
baz   one     1  2
      two     1  3
foo   one     2  4
      two     2  5
qux   one     3  6
      two     3  7
df.groupby([pd.Grouper(level=1), "A"]).sum() #level=1等价于level="second"
Out[54]: 
          B
second A   
one    1  2
       2  4
       3  6
two    1  4
       2  5
       3  7
df.groupby(["second", "A"]).sum()
Out[56]: 
          B
second A   
one    1  2
       2  4
       3  6
two    1  4
       2  5
       3  7
groups = data.groupby(pd.Grouper(key='time_col', freq='10min'))
for col in target_cols:  # 逐列计算
    t = groups[col].apply(lambda x: x - x.mean())
    data[col] = t.values
data.groupby(['实际温度', pd.Grouper(key='开关机状态')])['水流量'].sum()
实际温度  开关机状态
28°C  关          47884
29°C  关         58897795
30°C  关         25441119
31°C  关         31105002
32°C  关         21003639

Name: 水流量, dtype: int64

2. 另一个案例

解读这个代码,以及里面的各个函数,分步骤拆解:

unique_count = input_df.groupby(pd.Grouper(freq='H'))[colname].transform('nunique')

这段代码是在Python中使用的Pandas库,用于计算每小时的唯一值数量。以下是详细的解释:

  1. input_df:这是一个Pandas DataFrame,其中可能包含多个列,包括时间列colname

  2. pd.Grouper(freq='H'):这是一个Pandas函数,用于将DataFrame按小时分组。freq='H'表示以小时为单位进行分组。

  3. input_df.groupby(pd.Grouper(freq='H'))[colname]:这部分代码将input_df按小时分组,只选择colname这一列。

  4. .transform('nunique'):这是Pandas的另一个函数,用于计算每个组的唯一值数量。nunique表示计算唯一值的数量。

所以,整个代码的作用是计算每小时的colname列的唯一值数量。例如,如果colname是时间列,那么这段代码将返回每小时的时间点的数量。

3.时间分组

时间序列可以直接作为index,或者有一列是时间序列,差别不是很大。 这里仅仅演示,某一列为时间序列。

为 A 新增一列【生日】,由于分隔符 “/” 的问题,我们查看列属性,【生日】的属性并不是日期类型

(1) 按照【生日】的【年份】进行分组,看看有多少人是同龄?

A["生日"] = pd.to_datetime(A["生日"],format ="%Y/%m/%d")  # 转化为时间格式

A.groupby(A["生日"].apply(lambda x:x.year)).count()  # 按照【生日】的【年份】分组

(2) 同一年作为一个小组,小组内生日靠前的那一位作为小队长:

A.sort_values("生日", inplace=True) # 按时间排序

A.groupby(A["生日"].apply(lambda x:x.year),as_index=False).first()

as_index=False  # 保持原来的数据索引结果不变

first() 保留第一个数据

Tail(n=1) 保留最后n个数据

再进一步:

(3) 想要找到哪个月只有一个人过生日

A.groupby(A["生日"].apply(lambda x:x.month),as_index=False) # 到这里是按月分组

A.groupby(A["生日"].apply(lambda x:x.month),as_index=False).filter(lambda x: len(x)==1)
  • filter() 对分组进行过滤,保留满足()条件的分组
  • 用 first(),tail()截取每组前后几个数据
  • 用 apply()对每组进行(自定义)函数运算
  • 用 filter()选取满足特定条件的分组

参考链接:
https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html?highlight=pandas%20grouper

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值