快乐学习
前程无忧、中华英才非你莫属!

原创-Pandas心法之数据透视表-7

###############透视表##########################
import pandas as pd
import seaborn as sns

# 科学上网就好了。
# 其中包含有关该不幸航程的每位乘客的大量信息,
# 包括性别,年龄,舱位,已付车费等。
titanic = sns.load_dataset('titanic')
# print(titanic.head())

# 让我们按性别查看存活率:
# print(titanic.groupby('sex')[['survived']].mean())

'''
这立即为我们提供了一些见识:
总体而言,船上每四位女性中就有三位得以幸存,而只有五分之一的男性得以幸存!
'''

'''
这很有用,但我们可能想更进一步,按照性别和阶级来考察生存率
'''

# print(titanic.head())
# print('--------------------------')

life = titanic.groupby(['sex', 'class'])['survived'].aggregate('mean').unstack()
print(life)

print('--------------------------')

'''
透视表

透视表默认处理函数是均值
'''
tsb= titanic.pivot_table('survived', index='sex', columns='class')
print(tsb)
'''
这显然比该groupby方法更具可读性,并且产生相同的结果。
您可能会期望20世纪初的跨大西洋航行,
生存梯度对女性和更高阶层的人都有利。
一流的妇女几乎可以确定地生存(嗨,罗斯!),而十分之三的男性中只有一个幸存了(抱歉,杰克!)。

'''

# 多级透视表
'''
例如,我们可能有兴趣将年龄视为第三维。
我们将使用以下pd.cut功能对年龄进行分类:
'''
age = pd.cut(titanic['age'], [0, 18, 80])

tsc = titanic.pivot_table('survived', ['sex', age], 'class')
# print(tsc)

'''
在处理列时,我们也可以应用相同的策略。
让我们添加pd.qcut用于自动计算分位数的票价信息:
'''
fare = pd.qcut(titanic['fare'], 2)
dfs = titanic.pivot_table('survived', ['sex', age], [fare, 'class'])
# print(dfs)

'''
额外的数据透视表选项
'''

# survived 统计它sum, fare 统计它均值,以class 分组。索引是性别
tps = titanic.pivot_table(index='sex', columns='class',
                          aggfunc={'survived': sum, 'fare': 'mean'})
# print(tps)

'''
有时,计算每个分组的总数很有用。这可以通过margins关键字完成:
'''
tcm = titanic.pivot_table('survived', index='sex', columns='class', margins=True)

# print(tcm)
'''
在这里,这自动为我们提供了有关按性别分类不可知生存率,
按类别分类不可知性别生存率以及总生存率38%的信息。
可以使用margins_name关键字指定边距标签,默认为"All"。
'''

'''
例如:生育水平数据
'''
births = pd.read_csv('births.csv')
# print(births.head())

'''
通过使用数据透视表,我们可以开始更多地了解此数据。
让我们添加一个十年专栏,看看男女出生与十年的关系:
'''
births['decade'] = 10 * (births['year'] // 10)
bgs = births.pivot_table('births', index='decade', columns='gender', aggfunc='sum')
# print(bgs)
打赏

未经允许不得转载:同乐学堂 » 原创-Pandas心法之数据透视表-7

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

特别的技术,给特别的你!

联系QQ:1071235258QQ群:367203382
error: Sorry,暂时内容不可复制!