python--pandas数据聚合和分组运算

groupby机制

1.通过列进行分组

访问列1,并根据列2和列3调用groupby,生成的是对象:

s=df['列1'].groupby([df['列2'],df['列3']])

求和:sums=s.sum()

sums.unstack()

或者:

df.groupby(['key1','key2']).sum()

df.groupby(['key1', 'key2']).size():返回一个含有分组大小的Series

2.通过字典或Series进行分组

groupby后面可以传递字典:

people = pd.DataFrame(np.random.rand(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'] )

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

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

count() 计数

pd.Series()后也可传递字典

3.通过函数进行分组

people.groupby(len).sum()

函数跟数组、列表、字典、Series混合使用也可以

mode:众数

dataframe.quantile(q=0.5):分位数

如果要使用自己的聚合函数,只需将其传入aggregate或agg方法(自定义函数)即可:

def peak_to_peak(arr):

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

print(df.groupby().agg(peak_to_peak)

agg()后面可带多个函数

functions = ['count', 'mean', 'max']

result = grouped['tip_pct', 'total_bill'].agg(functions)

agg()函数是聚合函数:

agg()函数是聚合函数,

DataFrame.agg(func,axis = 0,* args,** kwargs )

data = df.groupby('uid').agg(

last_date=('@timestamp','max'), # 计算最近一次消费日期

F=('@timestamp','count'), # 计算消费次数 F

M=('price','sum'), # 计算消费总金额(也可选择平均值) M

).reset_index()

@@@func : 实现某种统计功能的函数,如果要不同列用求不同统计量,则用字典{‘行名/列名’:函数名’}指定。

如果传入的是一个由(name, function)元组组成的列表,则各元组的第一个元素就会被用作DataFrame的列名:

df.groupby(['key1','key2']).agg([('mm','mean'),('cc','count')])

向groupby传入as_index=False:以“没有行索引”的形式返回聚合数据

4.groupby对象支持迭代

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

print((k1, k2))

print(group)

将数据片段做成字典:

pieces =dict(list(df.groupby('key1')))

print(pieces['b'])

用df.get_group()查看每组内容:df.groupby(['d','s']).get_group(("uu",3)) (筛选d=uu以及s=3

)

逻辑运算

运算符:

与:&,或者:|,非:~

(1)与:df[(df['key1']=='a')&(df['key2']=='one')]

(2)或:df[(df['key1']=='a')|(df['key2']=='two')]

(3)非:df[~(df['key1']=='a')]

筛选

query()函数

df.query('(key1=="a")&(key2=="one")')

df.query('(key1=="a")|(key2=="one")')

df.query('~(key1=="a")')

df[df['key1'].isin(['a'])] (key1中包含'a'的所有数)

apply:一般性的“拆分-应用-合并”

apply会将待处理的对象拆分成多个片段,然后对各片段调用传入的函数,最后尝试将各片段组合到一起

tips.groupby('smoker').apply(top):对somker列进行分组并调用函数top

tips.groupby(['smoker', 'day']).apply(top, n=1, column='total_bill') 函数top的参数写在后面

函数top:按tip_pct列排序取前5名

def top(df,n=5,columns='tip_pct'):

return df.sort_values(by=columns,ascending=False).iloc[:n]

print(top(ff))

数据透视表与交叉图

pd.pivot_table(df,values='',columns='',index='',aggfunc= ,margins=True,fill_value=0)

margins=True:添加分项小计,增加all列,其值对应于单个等级中所有数据的分组统计。

aggfunc参数:使用其他聚合函数(默认是平均值)

fill_value:缺失值填充

pd.crosstab:计算分组频率

pd.crosstab(df.uu,df.pp,margins=True)

crosstab的前两个参数可以是数组或Series,或是数组列表:

pd.crosstab([df.uu,df.pp],df.one,margins=True)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值