参考:
https://blog.csdn.net/weixin_46713695/article/details/125416343
https://www.pudn.com/news/62ca63ff5f75f3409e963fdf.html
https://www.codenong.com/40433717/
常用写法
d.groupby(pd.Grouper(key='发布时间', freq='D')).sum()
d.groupby(pd.Grouper(key='发布时间', freq='D')).mean()
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
2.时间分组
时间序列可以直接作为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()选取满足特定条件的分组