首先需要澄清的是,excel非常强大,有可视化的数据处理,强大的功能,内置的powerquery,但是这些优势依然没有把边肖甩在后面,因为最核心的功能,excel一直没有跟上:
那是数据分析.
为什么这么说?excel在基础数据采集和处理方面有着得天独厚的优势,但是我们在采集数据的时候想要做的是对数据进行分析,而excel能够提供的功能却有些欠缺,比如:
常用的透视表只能通过求和、平均、最大、最小等方式计算。在实际分析中,这些计算方法过于基础,分组方法过于简单。
但是熊猫里面的数据分组透视功能非常强大,可以任意分组,自定义。分组后的数据可以应用更多免费的应用功能,定制化的功能将分组功能应用到了极致,一些看似复杂的分析需求变得异常简单。
分组键可以有多种形式,且类型不必相同:
与要分组的轴长度相同的列表或数组。
表示DataFrame的列名的值。
Dictionary或Series,给出要分组的轴上的值与分组名称之间的对应关系。
函数,用于处理轴索引或索引中的每个标签。
注意,后三种只是快捷方式,它们的最终目的仍然是生成一组用于拆分对象的值。
根据现有的列去分组
这也是最简单的。您可以根据一个键或传入列表支持多个键:
创建数据:
df=pd。DataFrame({'A'['a '' B '' A '' C '' A '' C '' B '' B'[2,8,1,4,3,2,5,9],' C'[102,98,107,104,115,87,92,123]})df根据一个键:
df.groupby('A ')。总和()根据两个键:
df.groupby(['A '' B'])。总和()根据字典映射去分组:
Mapping={'a'1,' b'1,' c'2} df。分组依据(映射,轴=1)。sum()映射={0:1,1:1,2:2,2。
根据列表(字典的简便写法):
但是有一个前提:您必须提供一个行或列长度相等的列表:
映射=[1,1,4] df。分组依据(映射,轴=1)。sum()字典不能相等?可以,但是没有映射的数据不在统计范围内:
mapping={0:1,1:1,2:2}df.groupby(mapping)。sum()mapping={'A'1,' B'1}df.groupby(mapping,axis=1)。总和()扩展:因为字典的映射关系,我们也可以用映射去筛选需要统计的数据去透视
根据自定义区间分组:
这里用到了cut函数,后面我会详细介绍这个函数。
DD _ 2=PD。Cut (DF ['b'],bin=2)DF。分组依据(DD _ 2)。Sum()如果我们有一些数据,这些数据包括年龄,我们可以根据这个方法区分不同的年龄段,不同的时间段,反正用的时候还是挺有用的。
根据函数去分组:
按函数分组的原则是按返回值分组,相同的返回值会被分成一组:
默认情况下,索引传递给函数:
Deff (x) :print (x)返回xdf。分组依据(f)。sum()deff(x): print(x)return x5df。分组依据(f)。sum()如果要使用另一列来应用该函数:
Deff (x) :打印(x)返回pd。切割(x,面元=3) df。group by (f (df ['c'])。sum ()
我今天要讲的是如何应用这些方法。
在指定轴上使用一个或多个运算进行聚合。
也就是说,在指定的轴上使用。
或多个聚合函数df.groupby("A").agg({"B":np.sum,"C":np.mean})
df.groupby("A").agg({"B":[np.sum,np.mean],"C":np.mean})
df.groupby('A')['B'].agg({'mean':np.mean,'standarddeviation':np.std})
df.groupby('A').apply(lambdax:x['C']-x['B'])df.groupby('A').apply(lambdax:(x['C']-x['B']).mean())
想要用好apply还要明白他的原理:
首先来看看是如何分组的,这次利用groupby的迭代器读取分组的数据:
fora,bindf.groupby('A'):print(a)print(b)
自定义函数应用时传入的就是每一个分组数据,你可以利用DataFrame的特性来筛选相应的列然后用来计算,具体能达到什么效果完全看你的想法了
注意:当你在根据键分组后具体返回什么也是靠你的自定义函数.
比如,我们分组后只返回B列的数据:
deff(x):returnx["B"]df.groupby("A").apply(f)
返回B的平方:
deff(x):returnx["B"]**2df.groupby("A").apply(f)
apply能达到的不仅仅这一点:
下面我们计算一下每个分组的B列最大值和最小值的差:
deff(x):returnmax(x["B"])-min(x["B"])df.groupby("A").apply(f)
下面我们统计每个分组的最后一行数据,这个要求在很多工具里面是很难实现的
deff(x):returnx[-1:]df.groupby("A").apply(f)
想要用好apply的核心就在于:分组后传入apply自定义函数的就是每个分组的DataFrame,返回值就是按照你的自定义函数来的。
还可以用这些常用的方法:
DataFrame.groupby(self,by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=False,observed=False,**kwargs)[source]
by:mapping,function,label,orlistoflabels
用于确定groupby的组。如果by是一个函数,则调用对象索引的每个值。如果传递了dict或Series,则将使用Series或dictVALUES来确定组(系列的值首先对齐;请参阅.align()方法)。如果传递了ndarray,则使用这些值来确定组。标签或标签列表可以通过self中的列传递给组。请注意,元组被解释为(单个)键。
axis:{0or‘index’,1or‘columns’},default0
按照行或列分割
level:int,levelname,orsequenceofsuch,defaultNone
如果轴是MultiIndex(分层),则按特定级别或级别分组。
as_index:bool,defaultTrue
对于聚合输出,返回以组标签作为索引的对象。仅与DataFrame输入相关。as_index=False实际上是“SQL风格”的分组输出。
sort:bool,defaultTrue
对组键进行排序。关闭它可以获得更好的性能。请注意,这不会影响每组内观察的顺序。Groupby保留每个组中的行顺序。
group_keys:bool,defaultTrue
调用apply时,将组键添加到索引以标识片段。
squeeze:bool,defaultFalse
如果可能,减少返回类型的维度,否则返回一致类型。
observed:bool,defaultFalse
**kwargs
Optional,onlyacceptskeywordargument‘mutated’andispassedtogroupby.
上一篇:鸡汤句子
下一篇:55岁女人正常体重是多少