目录
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 关 478
开 84
29°C 关 5889
开 7795
30°C 关 2544
开 1119
31°C 关 3110
开 5002
32°C 关 2100
开 3639
Name: 水流量, dtype: int64
2. 另一个案例
解读这个代码,以及里面的各个函数,分步骤拆解:
unique_count = input_df.groupby(pd.Grouper(freq='H'))[colname].transform('nunique')
这段代码是在Python中使用的Pandas库,用于计算每小时的唯一值数量。以下是详细的解释:
-
input_df
:这是一个Pandas DataFrame,其中可能包含多个列,包括时间列colname
。 -
pd.Grouper(freq='H')
:这是一个Pandas函数,用于将DataFrame按小时分组。freq='H'
表示以小时为单位进行分组。 -
input_df.groupby(pd.Grouper(freq='H'))[colname]
:这部分代码将input_df
按小时分组,只选择colname
这一列。 -
.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