分组 - df.groupby(by="A列") - 分组
-%E5%88%86%E7%BB%84.png&w=1920&q=85)
groupby()分组功能
import numpy as np
import pandas as pd
df = pd.DataFrame()
ls = [
{'名字': '小A', 'd1': 1, 'd2': 3, 'd3': 5},
{'名字': '小A', 'd1': 2, 'd2': 4, 'd3': 6},
{'名字': '小B', 'd1': 2, 'd2': 4, 'd3': 6},
{'名字': '小B', 'd1': 2, 'd2': 4, 'd3': 6},
]
df = df.append(ls, ignore_index=True)
>>> df
|
名字 |
d1 |
d2 |
d3 |
0 |
小A |
1 |
3 |
5 |
1 |
小A |
2 |
4 |
6 |
2 |
小B |
2 |
4 |
6 |
3 |
小B |
2 |
4 |
6 |
groupbying = df.groupby(by="名字")
>>> groupbying
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000016813E554E0>
# 查看对象内部的情况
>>> list(groupbying)
[
('小A',
名字 d1 d2 d3
0 小A 1 3 5
1 小A 2 4 6),
('小B',
名字 d1 d2 d3
2 小B 2 4 6
3 小B 2 4 6)
]
>>> list(groupbying)[0]
('小A', 名字 d1 d2 d3
0 小A 1 3 5
1 小A 2 4 6)
>>> list(groupbying)[1]
('小B', 名字 d1 d2 d3
2 小B 2 4 6
3 小B 2 4 6)
>>> type(list(groupbying)[0])
<class 'tuple'>
>>> type(list(groupbying)[0][0])
<class 'str'>
>>> list(groupbying)[0][0]
'小A'
>>> list(groupbying)[0][1]
名字 d1 d2 d3
0 小A 1 3 5
1 小A 2 4 6
>>> type(list(groupbying)[0][1])
<class 'pandas.core.frame.DataFrame'>
# 遍历.DataFrameGroupBy对象
>>> for name,group in groupbying:
... print(name)
... print(group)
...
小A
名字 d1 d2 d3
0 小A 1 3 5
1 小A 2 4 6
小B
名字 d1 d2 d3
2 小B 2 4 6
3 小B 2 4 6
# 选择
>>> groupbying.get_group('小A')
名字 d1 d2 d3
0 小A 1 3 5
1 小A 2 4 6
# 总数、最大值、最小值、平均值
>>> df
名字 d1 d2 d3
0 小A 1 3 5
1 小A 2 4 6
2 小B 2 4 6
3 小B 2 4 6
# df.groupby(["名字1","名字2"])["d1"].agg(["sum","max","min","mean","size"]).reset_index()
>>> df.groupby("名字")["d1"].agg(["sum","max","min","mean","size"]).reset_index()
|
名字 |
sum |
max |
min |
mean |
size |
0 |
小A |
3 |
2 |
1 |
1.5 |
2 |
1 |
小B |
4 |
2 |
2 |
2.0 |
2 |
不用reset_index()
也可以用df.columns = ['名字','sum','max'] # 重命名列名