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)