Python练习3-6:数据分组、合并、统计

练习3-6:数据分组、合并、统计

# 练习3-数据分组
# 字段的中文释义
# beer_servings---啤酒消耗量,spirit_servings--烈酒消耗量,wine_servings--红酒消耗量
# total_litres_of_pure_alcohol--总酒精消耗量,continent--所在大陆

import pandas as pd
#设置运行结果宽度,不用分段显示
pd.set_option('display.width',1000)
#显示所有的列
pd.set_option('display.max_columns',None)
#显示所有的行
pd.set_option('display.max_rows',None)

path3 = 'D:/demo/data/exercise_data/drinks.csv'
drinks = pd.read_csv(path3)
# print(drinks.head())

#哪个大陆(continent)平均消耗的啤酒(beer)更多
# print(drinks[['continent','beer_servings']].groupby(by = ['continent'],as_index = False).mean())
# print(drinks.groupby(by = ['continent'],as_index = False).beer_servings.mean())

#打印出每个大陆(continent)的红酒消耗(wine_servings)的描述性统计值
# print(drinks[['continent','wine_servings']].groupby(by = ['continent'],as_index = True).describe())
# print(drinks.groupby(by = ['continent']).wine_servings.describe())
#as_index默认是True,即默认使用continent(大陆)为索引


#打印出每个大陆每种酒类别的消耗平均值
# print(drinks.groupby('continent').mean())

# 打印出每个大陆每种酒类别的消耗中位数
# print(drinks.groupby('continent').median())

#打印出每个大陆对spirit饮品消耗的平均值,最大值和最小值
# print(drinks.groupby('continent').spirit_servings.agg(['mean','max','min']))


#练习4-apply函数
#探索1960-2014美国犯罪数据

#导入相关的库
import numpy as np
import pandas as pd

#导入数据集
path4 = 'D:/demo/data/exercise_data/US_Crime_Rates_1960_2014.csv'
crime = pd.read_csv(path4)
# print(crime.head())

#每一列(column)的数据类型是什么样的?即查看数据集的基本信息
# print(crime.info())
#注意到Year的数据类型是int32,pandas有一个不同的数据类型去处理时间序列(time series)

#将Year的数据类型转换为 datetime64
crime.Year = pd.to_datetime(crime.Year,format = '%Y')
# print(crime.info())

#将列Year设置为数据框的索引
# print(crime.head())  #crime数据集本身有默认的索引
crime = crime.set_index('Year',drop = True)
# print(crime.head())


#删除名为Total的列
del crime['Total']
# print(crime.head())

#按照Year(10年为一组)对数据框进行分组并求和
#注意若是对Population直接求和,是不对的,因为人口是累计数,不能直接求和
#'10AS'十年聚合日期第一天开始的形式进行聚合
crimes = crime.resample('10AS').sum()
# print(crimes)
#每十年加总的人口数换为每10年中最大的人口数
population = crime['Population'].resample('10AS').max()
# print(population)
crimes['Population'] = population
# print(crimes)


#何时是美国历史上生存最危险的年代?
#idxmax(0):返回每一列的最大值的索引值,前面已经将年份转变为数据集的索引值
# print(crime.idxmax(0))


#练习5-合并
#探索虚拟姓名数据
#导入数据库
import numpy as np
import pandas as pd

#创建数据集
raw_data_1 = {
    'subject_id':['1','2','3','4','5'],
    'first_name':['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'last_name':['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}

raw_data_2 = {
    'subject_id':['4','5','6','7','8'],
    'first_name':['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'last_name':['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}

raw_data_3 = {
        'subject_id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
        'test_id': [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]}

#将上面三个数据框分别命名为data1、data2、data3
data1 = pd.DataFrame(raw_data_1,columns = ['subject_id','first_name','last_name'])
data2 = pd.DataFrame(raw_data_2,columns = ['subject_id','first_name','last_name'])
data3 = pd.DataFrame(raw_data_3,columns = ['subject_id','test_id'])

# print(data1)
# print(data2)
# print(data3)


#将data1和data2两个数据框按照行的维度进行合并(即纵向合并),命名为all_data
all_data = pd.concat([data1,data2])
# print(all_data)

#将data1和data2两个数据框按照列的维度进行合并(横向合并),命名为all_data_col
all_data_col = pd.concat([data1,data2],axis = 1)
# print(all_data_col)

# 打印data3
# print(data3)

#按照subject_id的值对all_data和data3作合并
# print(pd.merge(all_data,data3,on = 'subject_id'))

#对data1和data2按照subject_id作连接
#类似与sql内连接
# print(pd.merge(data1,data2,on = 'subject_id',how = 'inner'))

#找到 data1 和 data2 合并之后的所有匹配结果
#外连接,所有连接的结果都显示出来,没有的用NaN值填充
# print(data1)
# print((data2))
# print(pd.merge(data1,data2,on = 'subject_id',how = 'outer'))


#练习6-统计
#探索风速数据

#导入所需库
import pandas as pd
import datetime

#导入数据
path6 = 'D:/demo/data/exercise_data/wind.data'

#parse_dates=[[’考试日期’,‘考试时间’]] :传入多列名,尝试将其解析并且拼接起来,parse_dates[[0,1,2]]也有同样的效果;
data = pd.read_table(path6,sep = '\s+',parse_dates = [[0,1,2]])
#\s+ 意思就是至少有一个空白字符存在
# print(data.head())
# print(data.info())
#parse_dates将多列拼接后使得Yr_Mo_Dy 数据类型为datetime64[ns]


#2061年?我们真的有这一年的数据?创建一个函数并用它去修复这个bug
def fix_century(x):
    if x.year > 1989:
        year = x.year - 100
    else:
        year = x.year
    return datetime.date(year,x.month,x.day)
data['Yr_Mo_Dy'] = data['Yr_Mo_Dy'].apply(fix_century)
# print(data.head())

#将日期设为索引,注意数据类型,应该是datetime64[ns]
# print(data['Yr_Mo_Dy'].dtype)   #object
#要先将其转换为datetime64[ns]
data['Yr_Mo_Dy'] = pd.to_datetime(data['Yr_Mo_Dy'])
# print(data['Yr_Mo_Dy'].dtype)   #datetime64[ns]
data = data.set_index('Yr_Mo_Dy')
#set_index()中只写列名,如果写data['列名']则被当作索引数据也会出现在数据列中,用drop语句也删不掉
# print(data.head())
# print(data.index)

#对应每一个location,一共有多少数据值缺失
# print(data.isnull().sum())


#对应每一个location,一共有多少完整的数据值
# print(data.info())
#其中有个Non-Null Count,即非空值统计

# print(data.shape)   #(6574, 13)
# print(data.shape[0] - data.isnull().sum())


#对于全体数据,计算风速的平均值
# print(data.mean().mean())

#创建一个名为loc_stats的数据框去计算并存储每个location的风速最小值,最大值,平均值和标准差
loc_stats = pd.DataFrame()
loc_stats['min'] = data.min()
loc_stats['max'] = data.max()
loc_stats['mean'] = data.mean()
loc_stats['std'] = data.std()

# print(loc_stats)

#创建一个名为day_stats的数据框去计算并存储所有location的风速最小值,最大值,平均值和标准差
day_stats = pd.DataFrame()
day_stats['min'] = data.min(axis = 1)
day_stats['max'] = data.max(axis = 1)
day_stats['mean'] = data.mean(axis = 1)
day_stats['std'] = data.std(axis = 1)

# print(day_stats.head())

# 对于每一个location,计算一月份的平均风速
#注意,1961年的1月和1962年的1月应该区别对待
#之前把时间作为索引并且从数据表的列中删掉了,现在将其添加回来并拆分为年月日
data['date'] = data.index

#将时间拆分为年月日并添加到数据框中
data['year'] = data['date'].apply(lambda x:x.year)
data['month'] = data['date'].apply(lambda x:x.month)
data['day'] = data['date'].apply(lambda x:x.day)

#查看是否拆分成功
# print(data.head())


january_winds = data.query('month == 1')
# print(january_winds.loc[:,'RPT':'MAL'].mean())
#使用loc是为了筛选列来统计,不是所有列都需要统计值

#对于数据记录按照年为频率取样,只需将月日定下,就可以取每年的不同值了
# print(data.query('month == 1 and day == 1'))

# 对于数据记录按照月为频率取样
# print(data.query('day == 1'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值