python对列表中的数值进行统计运算_python数据处理:分组运算

概述

分组聚合的过程:Split-apply-combine(拆分-应用-合并)第一阶段:pandas对象中的数据会根据提供的一个或多个键被拆分为多组。拆分操作是在对象的特定轴上执行的。

第二阶段:将一个函数应用到各个分组上并产生一个新值

第三阶段:所有这些函数的执行结果会被合并到最终的结果对象中。

一、分组:groupby

1.函数使用说明没有附加聚合函数的grouped实际上还没有进行任何计算,只是含有一些有关分组键的中间数据

df=pd.DataFrame({'key1':['a','a','b','c','b'],

'key2':['one','two','one','two','one'],

'data1':np.random.randn(5),

'data2':np.random.randn(5)})

grouped=df['data1'].groupby(df['key1'])选取分组列:两种方法相同

df.groupby('key1')['data1']

df['data1'].groupby(df['key1'])应用函数

grouped.size() #计算各分组大小一次传入多个分组键

df['data1'].groupby([df['key1'],df['key2']]).mean()对多个列进行分组计算

df.groupby([df['key1'],df['key2']]).mean()不以分组键作为索引:as_index=False

a.groupby(a['key'],as_index=False).agg([('dis',aaa)])不以分组键作为索引:group_keys=False

a.groupby(a['key'],group_keys=False).agg([('dis',aaa)])

二、分组应用

1.对分组进行迭代,获取各组值

for (k1,k2),group in df.groupby([df['key1'],df['key2']]):

print(k1,k2)

print(group)

2.通过字典对列进行分组

people=pd.DataFrame(np.random.randn(5,5),columns=['a,','b','c','d','e'],

index=['joe','steve','fred','ted','shawn'])

mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}

people.groupby(mapping,axis=1).sum()

3.通过series对列进行分组

a=pd.Series(mapping)

people.groupby(a,axis=1).count()

4.根据层次化索引进行分组

people=pd.DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],

index=[[1,2,1,2,3],['joe','steve','fred','ted','shawn']])

people.groupby(level=0).sum()

三、分组函数

1.经过优化的聚合函数

people=pd.DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],

index=['joe','steve','fred','ted','shawn'])

people.groupby(len).quantile(0.5) #计算样本分位数

people.groupby(len).describe() #计算描述性统计量

people.groupby(len).count()

people.groupby(len).sum()

people.groupby(len).mean()

people.groupby(len).median()

people.groupby(len).min()

people.groupby(len).max()

people.groupby(len).prod() #非NA的积

people.groupby(len).first() #第一个非NA的值

people.groupby(len).last() #最后一个非NA的值

people.groupby(len).std() #无偏(分母为n-1)标准差

people.groupby(len).var() #无偏(分母为n-1)方差

2.自定义函数:aggressivegate(agg)

def aaa(arr):

return arr.max()-arr.min()

people['a'].groupby(len).agg(aaa)一次应用多个函数

people['a'].groupby(len).agg(['max','min',aaa])注:自定义函数不用引号,如果传入一组函数,得到的dataframe列就会以相应的函数命名

传入一个由(name,function)元组组成的列表,各元组的第一个元素就会被用作dataframe的列名

people.groupby(len).agg([('最大','max'),('最小','min'),('差额',aaa)])对不同列应用不同的函数:向agg传入一个从列名映射到函数的字典

a=DataFrame({'key':['a','s','a','s','c'],

'value1':np.arange(5),

'value2':[1,1,1,1,1]})

a.groupby(a.key).agg({'value1':'sum','value2':'mean'})

3.自定义函数:apply

df=pd.read_csv('redcard.csv')

def top(df,n=2,column='height'):

return df[-n:]

df['player'].groupby(df.leagueCountry).apply(top)

4.Transform分组后不进行聚合,而是对不同分组添加新列

如果各分组产生的是一个标量值,则该值就会被广播出去。

a.为dataframe添加一个用于存放各组平均值的列一个办法是先聚合再合并

a=pd.DataFrame({'weekday':['MON','TUE','MON','TUE'],

'goods':['a','a','b','b'],

'values1':[1,2,3,4],

'values2':[5,6,7,8]})

b=a.groupby(a.weekday).sum()

pd.merge(a,b,left_on='weekday',right_index=True)使用transform方法

a=pd.DataFrame({'weekday':['MON','TUE','MON','TUE'],

'goods':['a','a','b','b'],

'values1':[1,2,3,4],

'values2':[5,6,7,8]})

a['mean']=a['values1'].groupby(a.goods).transform(np.mean)

b.应用自定义函数

def demean(arr):

return arr-arr.mean()

a['demean']=a['values1'].groupby(a.goods).transform(demean)

三、透视表和交叉表

1.透视表透视表是一种常见的数据汇总工具。他根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。

a.pandas.pivot_table

pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')data: DataFrame

values :进行聚合预算的数据列

index: 行索引

columns : 列索引

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo","bar", "bar", "bar", "bar"],

"B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],

"C": ["small", "large", "large", "small", "small", "large", "small", "small", "large"],

"D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})

pd.pivot_table(df, values='D', index=['A', 'B'],columns=['C'], aggfunc=np.sum)

Clargesmall

AB

barone4.05.0

two7.06.0

fooone4.01.0

twoNaN6.0Margins:添加分项小计

pd.pivot_table(df, values='D', index=['A', 'B'],columns=['C'], aggfunc=np.sum,margins=True)Fill_value:填充缺失值

pd.pivot_table(df, values='D', index=['A', 'B'],columns=['C'], aggfunc=np.sum,margins=True,fill_value=0)dropna:删除全为NA的列

pd.pivot_table(df, values='D', index=['A', 'B'],columns=['C'], aggfunc=np.sum,margins=True,fill_value=0,dropna=True)

2.交叉表Pandas.crosstab

crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)计算分组频数

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo","bar", "bar", "bar", "bar"],

"B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],

"C": ["small", "large", "large", "small", "small", "large", "small", "small", "large"],

"D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})

pd.crosstab(df.A,df.B,margins=True,dropna=True)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值