这一节将学习的是Pandas中对数据的一些统计计算与总结,在学习如何总结整个数据集之后,还将深入研究数据分组,从而允许我们汇总具有共同点的数据集。我们还将学习如何创建数据透视表,这是总结只有两列的数据集数据间相关关系的好方法。
Unit 2 Data Manipulation with Pandas
Lesson 3 Aggregates in Pandas
一、DataFrame的统计计算
在前一课中,我们学习了如何对列中的每个值执行操作的.apply语句。在这一节中,我们将学习如何将列中的所有值组合计算。怎么做呢,像Excel一样,还是运用Python里的一些基本函数。一般的代码模板如下
df.column_name.command()
先以几个现实中的例子开始吧:
DataFrame customers包含了客户姓名和年龄,求客户年龄均值
print customers.age
>> [23, 25, 31, 35, 35, 46, 62]
print customers.age.median()
>> 35
DataFrame shipments包含了销售的T恤、颜色,求还剩下一件的都是啥颜色T恤
print inventory.color
>> ['blue', 'blue', 'blue', 'blue', 'blue', 'green', 'green', 'orange', 'orange', 'orange']
print inventory.color.unique()
>> ['blue', 'green', 'orange']
看了上面两个例子应该懂了,下面列出了一些常用的统计函数的含义。
二、分类统计
pandas提供了分类统计的语句和SQL中的一样为.groupby。代码模板如下
df.groupby('column1').column2.command()
数据按照column1进行分组为一组组数据,然后对column2执行command。
例如,学生的作业成绩表中分别有学生名student和所做的作业assignment_name和所对应的成绩grade三列。每个学生对应一或多套作业。
想要计算出不同学生的平均成绩,代码为
import pandas as pd
student_grade = pd.read_csv('student_grade.csv')
grades = student_grade.groupby('student').grade.mean()
print(grades)
print(type(grades))
在使用groupby之后,我们经常需要清理得到的数据结果。groupby函数创建了一个新的Series,而不是DataFrame。 为了得到一个新的DataFrame,我们可以使用reset_index()。 这将把我们的数据变成一个DataFrame,并将这些索引移动到它们自己的列中。
这时只需要在groupby语句后加reset_index()
df.groupby('column1').column2.measurement().reset_index()
例如计算库存中每种茶件数,
teas_counts = teas.groupby('category').id.count().reset_index()
teas_counts = teas_counts.rename(columns={"id": "counts"})
print(teas_counts)
那么,与上一节类似的,如果执行的函数比求平均值,计数等更为复杂,就要结合到Lambda函数和apply语句。假设要计算不同颜色鞋子价格的1/4分割线(25%鞋子便宜于此价格,75%的鞋子贵于此价格)来确保品牌一直有便宜的鞋子出售。
import numpy as np
import pandas as pd
orders = pd.read_csv('orders.csv')
cheap_shoes=orders.groupby('shoe_color').price.apply(lambda x: np.percentile(x,25)).reset_index()
print(cheap_shoes)
reset_index()为最后一步
分类统计:更复杂的情况下,我们想要按多个列进行分组。 同样可以用groupby语句来轻松完成此操作。
上列中,我们的采购团队认为,某些shoe_type / shoe_color组合在今年特别受欢迎(例如,蓝色芭蕾平底鞋曾在巴黎风靡一时)。于是看一下每种鞋子的件数shoe_counts(按shoe_type / shoe_color分类)。
import numpy as np
import pandas as pd
orders = pd.read_csv('orders.csv')
shoe_counts=orders.groupby(['shoe_type','shoe_color']).id.count().reset_index()
shoe_counts=shoe_counts.rename(columns={'id':'counts'})
#No 'apply' function
print(shoe_counts)
三、数据透视表
我们在学习Excel的时候都使用过数据透视表,它能直观地展示数据。当我们跨越多列执行groupby时,我们经常想要更改数据的显示方式。 例如,回想一下我们运营连锁店的例子,并且有关于不同种类不同颜色鞋的销售数量的数据:
我们怀疑不同种类的鞋的不同颜色会有不同的销售额,那么,比较两表,这样比较会更有效率,因为我们不会将shoe_type搞混了。
生成PIvot Table的模板为:
df.pivot(columns='ColumnToPivot',
index='ColumnToBeRows',
values='ColumnToBeValues')
例如,上面的数据透视表的代码为
import numpy as np
import pandas as pd
orders = pd.read_csv('orders.csv')
shoe_counts = orders.groupby(['shoe_type', 'shoe_color']).id.count().reset_index()
shoe_counts_pivot=shoe_counts.pivot(
columns='shoe_color',
index='shoe_type',
values='id').reset_index()
print(shoe_counts_pivot)
Ps.我在学习pandas时,还学到了一个Python中 ' ~ ' (取反) 操作符。即如果结果是True,则返回False;结果为False,返回True。
创建新列反映某列是否为空值(是空值则返回False,反之True):
ad_clicks['is_click'] = ~ad_clicks.ad_click_timestamp.isnull()
在前加~即可。