Python数据分析数据可视化-----确实比较麻烦的Pandas数据分组工作(持续更新中)

这篇博客呢写一下Pandas数据分组实现方法
很多时候我们需要对数据进行分组讨论,所以这篇博客对后面做数据分析真的还是蛮重要的,有必要好好看一下
Pandas数据分组最常用的是groupby方法
(1)分组
创建DataFrame

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})
print(df)

输出结果:
在这里插入图片描述
将DataFrame按A分组,我们得到的是一个中间数据,并没有进行任何计算

print(df.groupby('A'), type(df.groupby('A')))

输出结果:
在这里插入图片描述
对数据分组后并进行一些计算

a = df.groupby('A').mean()
b = df.groupby(['A','B']).mean()
c = df.groupby(['A'])['D'].mean()  # 以A分组,算D的平均值
print(a,type(a),'\n',a.columns)
print(b,type(b),'\n',b.columns)
print(c,type(c))

输出结果:
在这里插入图片描述
通过分组后的计算,将得到一个新的Dataframe,可对单个列或者多个列进行分组
(2)分组–可迭代对象
创建分组

df = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]})
print(df)

输出结果:
在这里插入图片描述
以‘X’分组,可迭代对象,直接生成一个list或者以元祖形式显示

print(list(df.groupby('X')), '→ 可迭代对象,直接生成list\n')
print(list(df.groupby('X'))[0], '→ 以元祖形式显示\n')

输出结果:
在这里插入图片描述
分组后我们可以提取分组后的内容,通过get_group()实现

print(df.groupby(['X']).get_group('A'),'\n')
print(df.groupby(['X']).get_group('B'),'\n')

输出结果:
在这里插入图片描述
(3)其他轴上的分组
我们也可以自定义函数按照值的类型进行分列

df = pd.DataFrame({'data1':np.random.rand(2),
                  'data2':np.random.rand(2),
                  'key1':['a','b'],
                  'key2':['one','two']})
print(df)
print(df.dtypes)
print('-----')
for n,p in df.groupby(df.dtypes, axis=1):
    print(n)
    print(p)
    print('##')
# 按照值类型分列

输出结果:
在这里插入图片描述
(4)通过字典或者Series分组
创建DataFrame

df = pd.DataFrame(np.arange(16).reshape(4,4),
                  columns = ['a','b','c','d'])
print(df)

输出结果:
在这里插入图片描述
创建字典,并通过字典的值进行分组并求和

mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
by_column = df.groupby(mapping, axis = 1)
print(by_column.sum())

输出结果:
在这里插入图片描述
创建Series进行分组,并计数

s = pd.Series(mapping)
print(s,'\n')
print(s.groupby(s).count())

输出结果:
在这里插入图片描述
(5)一般的分组函数计算方法

s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3])
grouped = s.groupby(level=0)  # 唯一索引用.groupby(level=0),将同一个index的分为一组
print(grouped)
print(grouped.first(),'→ first:非NaN的第一个值\n')
print(grouped.last(),'→ last:非NaN的最后一个值\n')
print(grouped.sum(),'→ sum:非NaN的和\n')
print(grouped.mean(),'→ mean:非NaN的平均值\n')
print(grouped.median(),'→ median:非NaN的算术中位数\n')
print(grouped.count(),'→ count:非NaN的值\n')
print(grouped.min(),'→ min、max:非NaN的最小值、最大值\n')
print(grouped.std(),'→ std,var:非NaN的标准差和方差\n')
print(grouped.prod(),'→ prod:非NaN的积\n')

输出结果:
在这里插入图片描述
(6)多函数计算
可以通过list或dict的方法传入函数计算式,主要通过agg()来实现

df = pd.DataFrame({'a':[1,1,2,2],
                  'b':np.random.rand(4),
                  'c':np.random.rand(4),
                  'd':np.random.rand(4),})
print(df)
print(df.groupby('a').agg(['mean',np.sum]))
print(df.groupby('a')['b'].agg({'result1':np.mean,
                               'result2':np.sum}))

在这里插入图片描述
上面讲了很多种分组方法,其实牢牢掌握住一种就ok啦,能用一种就行

关注欢喜,走向成功~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值