pandas中的GroupBy函数

"""pandas提供了一个灵活高效的groupby功能,它使你能一种自然地方式对数据集进行切片,切换,摘要等操作。
根据一个或者多个键(可以是函数可以是数组或者DataFrame列名)拆分pandas对象。计算分组摘要统计,
如计数、平均数、标准差、或者用户自定义的函数
1:首先看看下面这个非常简单的表格性数据集
"""
import  pandas as pd
import  numpy as np
import  random
random.seed()
df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],
'key2':['one', 'two', 'one', 'two', 'one'],
'data1':np.random.randn(5),
'data2':np.random.randn(5)})
print(df)
#假设你想要按key1进行分组,并计算data1列的平均值,你可以先访问data1,并且根据key1调用groupby:
grouped=df['data1'].groupby(df['key1']) #根据一个条件进行分组
"""
注意groupby是一个Groupby对象,他实际上还没有进行任何计算,
只是含有一些有关分组键df['key1']的中间数据而已,然后我们可以掉用GroupBy的mean()方法来计算分组的平均值。
"""
print(grouped)
print(grouped.mean())
"""
注意:数据Series根据分组键进行聚合,产生一个新的Series,其索引为key1列中的唯一值,之所以
结果中的索引值的名称为key1,是因为原始的DataFrame的列df['key1']就叫这个名字。
"""
print(type(grouped.mean()))
""""
2:如果我们一次传入多个分组,就会得到不同的结果。
通过两个键对数据进行了分组,得到的Series具有一个层次化索引
"""
means=df['data1'].groupby([df['key1'],df['key2']])
print(means.mean())
#以上这些事例二中,分组键均为Series.实际上,分组键可以是任何长度适当的数组。
print("*"*50)
#*************************************************************************************************
states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
grouped2=df['data1'].groupby([states,years]).mean()
print(grouped2)
print("*"*50)
#************************************************************************************
""""
3:此外还可以将列名用作分组

"""
grouped3=df.groupby('key1')
print(grouped3.mean())
#用列名进行多个条件进行分组
grouped4=df.groupby(['key1','key2'])
print(grouped4.mean())
""""
说明:在执行df.groupby('key1').mean()时:结果中没有key2列。这是因为df['key2]不是数值数据,所以被从结果中
排除了出来,默认情况下,虽有数值列都会被聚合,虽然有时候会过滤为一个子集。
"""
#无论你准备拿groupby做什么,都有可能用到groupby中的size方法,他可以返回一个含有分组大下的Series
size=df.groupby(['key1','key2']).size()
print(size)
"""
注意分组中的任何缺失值都会被排除在结果中外的。
"""
""""
4:对分组进行迭代
注意:GroupBy对象支持迭代,可以产生一组二元数组(有分组名和数据块组成)。看看下面的这个简单的数据集:
"""
for name,group in df.groupby('key1'):
    print(name)
    print(group)
#对于多键的情况,元组的第一元素将会是由键值组成的元组:
for (k1,k2),group in df.groupby(['key1','key2']):
    print(k1,k2)
    print(group)
""""
5:选取一个或者一组列
"""
da1=df.groupby('key1')['data1']
da2=df.groupby('key1')['data2']
#以上的代码等价为:
da1=df['data1'].groupby(df['key1'])
da2=df['data2'].groupby(df['key1'])
"""
尤其对于大数据集,很可能值需要对部分列进行聚合。例如:在前面的数据集,
如果只需计算data2的平均值并且以DataFrame形式得到结果
"""
group2=df.groupby(['key1','key2'])['data2'].mean()
print(group2)

group3=df.groupby(['key1','key2'])[['data2']].mean()
print(group3)
"""
注意:以上的这两种操作所返回的对象是一个已分组的DataFrame(如果传入的是列表或数组)
或已分组的Series(如果传入的是标量形式的单个列名)
"""

猜你喜欢

转载自blog.csdn.net/bll1992/article/details/85104070