之前的两期中,我们简单的讨论了Pandas中两种基本的数据结构,Series和DataFrame。今天我们来说一说pandas中的几个重要的函数,分别是groupby,apply和concat。
groupby函数
首先来看一下groupby函数,顾名思义,groupby就是按照xx分组的意思,所以这个函数就是用来对DataFrame进行分组使用的。下边来看一个例子,就能清楚的看明白这个函数的功能了。
salaries = pd.DataFrame({
'Name':['BOSS','HanMeimei','HanMeimei','Han','BOSS','BOSS','HanMeimei','BOSS'],
'Year':[2016,2016,2016,2016,2017,2017,2017,2017],
'Salary':[40000,5000,4000,3000,38000,42000,6000,39000],
'Bonus':[12000,3000,3500,1200,16000,18000,7000,21000]
})
上边的代码定义了一个DataFrame,名字叫做salaries。
接下来,我们对这个salaries按照“Name”属性进行分组。
group_by_name = salaries.groupby('Name')
那么group_by_name
到底是个什么样子的呢?
可以看出,groupby
其实是将原来的salaries
按照Name
分成了三类,这时候,我们自然而然的就会想到对每一类里边的属性(如Bonus
, Salaries
等)做一些操作,如求和(sum
),求平均值(mean
),求中位数(median
)等。
group_by_name.sum() #求和
group_by_name.mean() #求平均
当属性特别多的时候,我们只想对某几列做统计算,这时候需要在group_by_name
中挑选特定的列进行计算:
group_by_name[['Bonus','Salary']].sum()
有时候,我们肯定想知道某项在整个数据中到底出现了多少次,这时候可以利用groupby
来做。
salaries.groupby('Name').size()
现在我们想要看一下每个类别的人的工资和奖金的均值,中位数,求和,标准差。这时候要分为两个步骤,首先对数据进行groupby
分组,然后对分组后的数据进行求和,求均值等操作。
salaries.groupby('Name')[['Bonus','Salary']].agg(['sum','mean','std','median'])
#使用numpy中的函数
salaries.groupby('Name')[['Bonus','Salary']].agg([np.sum,np.mean,np.std,np.median])
apply函数
为salaries
添加一个临时列tmp_col
。
salaries.loc[:,'tmp_col'] = ( salaries['Salary'] * 2 -1500 ) / 0.8
def trans(x):
return ( x * 2 - 1500 ) / 0.8
salaries.loc[:,'tmp_col2'] = salaries['Salary'].apply(trans)
从上边的例子中可以看出,apply函数可用来对某一列进行自定义的操作,只需要自己定义一个函数,然后对这一列调用apply
函数即可。
大家不要小瞧apply
函数,这个函数厉害的地方就在于能够对某一列进行自定义的操作,只要你相对某一列做各种复杂的操作,只需要自己写一个函数,然后调用apply
就可以了。
concat函数
concat
函数是一个拼接函数,作用就在于将几个DataFrame进行拼接,从而形成一个新的DataFrame。
我们首先定义三个DataFrame,分别命名为df1
,df2
,df3
df1 = pd.DataFrame({'apt':[55000,60000],'cars':[200000,300000]},index = ['Shanghai','Beijing'])
df2 = pd.DataFrame({'apt':[35000,45000],'cars':[120000,100000]},index = ['Hangzhou','Guangzhou'])
df3 = pd.DataFrame({'apt':[30000,10000],'cars':[120000,100000]},index = ['Nanjing','Chongqing'])
#将上述三个DataFrame进行拼接
result = pd.concat([df1,df2,df3])
从上边的结果可以看出,concat
默认是按照列对齐的方式进行拼接,即每一条数据都有这些属性。但有时候,我们也需要按照行对齐的方式进行拼接,针对这些数据,不断的添加属性的种类。
pd.concat([df1,df1,df1],index = 1)