Pandas Snippet — Group By
Mar222019
#!/usr/bin/env python3
import pandas as pd
import numpy as np
def main():
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3, 2, 1, 1, 2, 3, 1, 2],
'Year': [2014, 2015, 2014, 2015, 2014, 2015, 2016, 2017, 2016, 2014, 2015, 2017],
'Points': [876, 789, 863, 673, 741, 812, 756, 788, 694, 701, 804, 690]}
df = pd.DataFrame(ipl_data)
df = df.sort_values(by='Year')
# 迭代遍历分组
print('-------------------------------------------------------')
print(df)
print('-------------------------------------------------------')
grouped = df.groupby('Team')
print(grouped.groups) # 单列分组
for key, value in grouped:
print(key)
print(value)
print('-------------------------------------------------------')
print('-------------------------------------------------------')
groupby = df.groupby(['Team', 'Year'])
print(groupby.groups) # 多列分组,
for key, value in groupby: # key 是分组信息, value 还是原来的数据,是一个分组, 包含原来的所有的列(包括分组的列)
print(key)
print(value)
print('-------------------------------------------------------')
# 选择一个分组
grouped = df.groupby('Year')
print('-------------------------------------------------------')
print(grouped.get_group(2015)) # get_group 的参数是 需要跟原来数据格式匹配, 原来2015是int型, 这里传'2015' 就会报错,
# 分组聚合
grouped = df.groupby('Year')
print('-------------------------------------------------------')
print(grouped['Points'].agg(np.mean)) # 计算按照Year分组, Points 列的平均数
print('-------------------------------------------------------')
print(grouped[['Points', 'Rank']].agg(np.mean)) # 计算多个列的平均数
print('-------------------------------------------------------')
print(grouped['Rank'].nunique()) # 计算分组(按Year分组)中 Rank 列不重复值数量
print('-------------------------------------------------------')
print(grouped['Points', 'Rank'].agg([np.sum, np.mean, np.std])) # 分组后, 多个列上应用多个 聚合函数
# 分组转换
df = pd.DataFrame(data={'A': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3], 'B': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
'C': [2, 2, 2, 2, 3, 3, 3, 4, 4, 4], 'D': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]},
index=pd.date_range('1/1/2020', periods=10))
grouped = df.groupby('A')
print('-------------------------------------------------------')
print(grouped.agg(np.mean))
score = lambda x: x + x.mean() # 将各个分组内的原始数值 替换为 原始数值 + 该分组的平均数,
# 这里按照A列分组, 氛围三组, 1 - 4行, 2 - 3行, 3 - 3行,
print('-------------------------------------------------------')
print(grouped.transform(score))
"""
B C D # 各列,各分组的 平均值
A
1 1.0 2.0 2.5
2 1.0 3.0 6.0
3 1.0 4.0 9.0
-------------------------------------------------------
B C D
2020-01-01 2.0 4.0 3.5 # 第一分组, B列均值为2,所以B列 原始的数值都加上 分组均值2, 全部变成4了,
2020-01-02 2.0 4.0 4.5
2020-01-03 2.0 4.0 5.5
2020-01-04 2.0 4.0 6.5
2020-01-05 2.0 6.0 11.0 # 第二分组, B列均值为3, B列该分组的当前值 都为 3 + 3 = 6
2020-01-06 2.0 6.0 12.0
2020-01-07 2.0 6.0 13.0
2020-01-08 2.0 8.0 17.0
2020-01-09 2.0 8.0 18.0
2020-01-10 2.0 8.0 19.0
"""
# 过滤
my_filter = df.groupby('A').filter(lambda x: len(x) > 3)
print('-------------------------------------------------------')
print(my_filter) # 原来的DataFrame中, 属于的分组长度大于3的元素会保留下来,因此,
""" 只有 A列=1的行会被保留下来,所以这里的输出如下, 可以看到 只有A=1的行被保留下来了, 相当于SQL 里group by之后的Having 语句
A B C D
2020-01-01 1 1 2 1
2020-01-02 1 1 2 2
2020-01-03 1 1 2 3
2020-01-04 1 1 2 4
"""
if __name__ == '__main__':
main()
赞 赏微信赞赏 支付宝赞赏