Python数据处理之数据聚合

Python 数据聚合

今天总结一下Python数据聚合中的一些小例子,一方面是自己复习,另外希望对小码们有所帮助

1.Series数据聚合

import pandas as pd
import numpy as np
ser=pd.Series([12,8,20,14,6,10],index=['white','white','red','red','black','black'])
ser.index.name='color'
print("原数据:")
print(ser)
ser1=ser.groupby('color').mean()
print("根据color索引将各组数据平均聚合:")
print(ser1)

运行结果:
在这里插入图片描述
注:

  1. 在数据聚合之后根据字母先后排序,所以转为依次输出black,red,white
  2. 使用mean函数得到分组后的各组数据的平均值

2.DateFrame数据聚合

import pandas as pd
frame=pd.DataFrame([[3,5,7,9],[11,13,15,17],[2,4,6,8],[10,12,14,16]],
                   index=[['odd','odd','even','even'],['small','big','small','big']])
frame.index.names=['obj','id']
print("增加索引名称后:")
print(frame)
frame1=frame.groupby('obj').mean()
print("根据obj聚合后:")
print(frame1)
frame2=frame.groupby('id').mean()
print("根据id聚合后:")
print(frame2)

运行结果:
在这里插入图片描述
注:

  1. 在程序中使用mean函数,所得结果理由同上例

3.等级分组

import pandas as pd
frame=pd.DataFrame([[3,5,7,9],[11,13,15,17],[2,4,6,8],[10,12,14,16]],
                   index=[['odd','odd','even','even'],['small','big','small','big']])
frame.index.names=['obj','id']
frame.columns=['a','b','c','d']
print("增加行索引和列索引后后的数据:")
print(frame)
print("a列根据obj和id进行分组:")
frame1=frame['a'].groupby(['obj','id']).mean()
print(frame1)
print("a,b列根据obj和id进行分组:")
frame2=frame[['a','b']].groupby(['obj','id']).mean()
print(frame2)

运行结果:
在这里插入图片描述

4.迭代输出分组

import pandas as pd
frame=pd.DataFrame([[3,5,7,9],[11,13,15,17],[2,4,6,8],[10,12,14,16]],
                   index=[['odd','odd','even','even'],['small','big','small','big']])
print(frame)
frame.index.names=['obj','id']
frame.columns=['a','b','c','d']
for name,group in frame.groupby('obj'):
    print("------------------"+name+"------------------")
    print(group)
quit()

运行结果:
在这里插入图片描述
注:按照obj分组后,分别将不同的obj作为一组输出

5. 分位数的计算

此处附分位数的相关知识,前辈的解答也很详细,大家可参考该文理解分位数的概念以及计算 快点我,我是分位数

import pandas as pd
import numpy as np
data=np.random.randint(0,30,10)
ser=pd.Series(data,index=['a','a','a','b','b','b','b','c','c','c'])
ser.index.name='id'
print(ser)
group=ser.groupby('id')
# 此处概率点取0.6
ser1=group.quantile(0.6)
print("--------分组后各组的分位数(概率点为0.6)----------")
print(ser1)

运行结果:
在这里插入图片描述

6.自定义聚合函数

通常情况下在聚合过程中可以选择使用系统给出的聚合函数,当然也可以使用自定义的聚合函数 ☟ ☟ ☟ ☟ ☟

import pandas as pd
import numpy as np
# eg6   自定义聚合函数
# 返回本组的最大值与最小值的差(极差)
def mydef(series):
    return series.max()-series.min()
frame=pd.DataFrame([[3,5,7,9],[11,13,15,17],[2,4,6,8],[10,12,14,16]],
                   index=[['odd','odd','even','even'],['small','big','small','big']])
frame.index.names=['obj','id']
frame.columns=['a','b','c','d']
print(frame)
#根据obj索引分组
group=frame.groupby('obj')
print("--------调用自定义的聚合函数----------")
frame1=group[['a','b']].agg(mydef)
print(frame1)

运行结果:
在这里插入图片描述

7.transform()函数

import pandas as pd
import numpy as np
frame=pd.DataFrame([[3,5,7,9],[11,13,15,17],[2,4,6,8],[10,12,14,16]],
                   index=[['odd','odd','even','even'],['small','big','small','big']])
frame.index.names=['obj','id']
frame.columns=['a','b','c','d']
group=frame.groupby('obj')
print(frame)
# 聚合结果为一组的数据之和增加前缀
print("--------调用sum()函数将分组后的数据求和----------")
frame1=group[['a','b']].sum().add_prefix('test_')
print(frame1)
# 用numpy函数计算
print("--------使用transform函数调用numpy的sum()函数将分组后的数据求和----------")
frame2=group[['a','b']].transform(np.sum).add_prefix('test1_')
print(frame2)

运行结果:
在这里插入图片描述
注:

  1. add_prefix()函数用于增加前缀
  2. numpy的sum函数调用之后,会将所有的项输出,但是每一项都是对应组的对应值(此处与后序介绍的apply函数有所不同)

8.apply()函数

import pandas as pd
import numpy as np
frame=pd.DataFrame([[3,5,7,9],[11,13,15,17],[2,4,6,8],[10,12,14,16]],
                   index=[['odd','odd','even','even'],['small','big','small','big']])
frame.index.names=['obj','id']
frame.columns=['a','b','c','d']
group=frame.groupby('obj')
print(frame)
# 聚合结果为一组的数据之和增加前缀
frame1=group[['a','b']].sum().add_prefix('test_')
print("--------调用sum()函数将分组后的数据求和----------")
print(frame1)
frame2=group[['a','b']].apply(np.sum).add_prefix('test1_')
print("--------调用apply()函数将分组后的数据求和----------")
print(frame2)

运行结果:

在这里插入图片描述
注:此处与上述transform函数有所不同

文中若有失误,还请小码们指出,倍加感谢。祝大家学习愉快♡

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子味的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值