练习一:探索Chipotle快餐数据
1. 导入 Pandas
2. 从如下地址导入数据集chipotle.tsv
3. 将数据集存入一个名为chipo的数据框内
import pandas as pd chipo=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\chipotle.tsv',sep='\t') #以换行为分隔符,否则默认',',会报错4. 查看前10行内容
chipo.head(10)5. 数据集中有多少个列
#chipo.shape会打印出有几行几列,想知道有几列,则为 chipo.shape[1] #几行就是chipo.shape[0]6.打印出全部的列名称
chipo.columns7.数据集的索引是怎样的
chipo.index #删除列chipo=chipo.drop(['列名'],axis=1)8.被下单数最多商品(item)是什么?
a=chipo[['item_name','quantity']].groupby(by='item_name').agg('sum') #agg会将 a=e.sort_values(['quantity'],ascending=False) a.head(1) #chipo[['item_name','quantity']].groupby(by='item_name').sum().sort_values('quantity',ascending=False).head(1)自己写的9.在item_name这一列中,一共有多少种商品被下单?
pd.unique(chipo['item_name']).size #注意这个是array类型了,所以用size #答案 chipo['item_name'].nunique()10.在choice_description中,下单次数最多的商品是什么?
chipo['choice_description'].value_counts().head(1)11.一共有多少商品被下单?(quantity)
chipo['quantity'].sum()12.将item_price转换为浮点数
c=lambda x:float(x[1:-1]) chipo['item_price'].apply(c)13.在该数据集对应的时期内,收入(revenue)是多少
chipo['revenue']=chipo['item_price']*chipo['quantity'] chipo['revenue'].sum()14.在该数据集对应的时期内,一共有多少订单?
chipo['order_id'].unique().size #chipo['order_id'].nunique()15.每一单(order)对应的平均总价是多少?(自己瞎写的)
a=chipo.groupby(['order_id']).agg(sum) a['avg_price']=a['item_price']/a['quantity']16.一共有多少种不同的商品被售出?
chipo['item_name'].nunique()
练习二:数据过滤与排序
1. 导入 Pandas
2. 从如下地址导入数据集Euro2012_stats.csv
3. 将数据集存入一个名为euro12的数据框内
import pandas as pd euro12=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\Euro2012_stats.csv')4.只选取 Goals 这一列
euro12['Goals'] #结果是Series5.有多少球队参与了2012欧洲杯?
euro12['Team'].nunique()6.该数据集中一共有多少列(columns)?
euro12.shape[1]7.将数据集中的列Team, Yellow Cards和Red Cards单独存为一个名叫discipline的数据框
discipline=euro12[['Team','Yellow Cards','Red Cards']] discipline8.对数据框discipline按照先Red Cards再Yellow Cards进行排序
discipline.sort_values(['Red Cards','Yellow Cards'],ascending=[False,False])9.计算每个球队(意思是所有球队的黄牌平均值)拿到的黄牌数的平均值(不要小数)
round(discipline['Yellow Cards'].mean())10.找到进球数Goals超过6的球队数据
euro12[euro12.Goals>6]11.选取以字母G开头的球队数据
euro12[euro12['Team'].str.startswith('G')]12.选取前7列
#euro12.head(7) #这是前7行,蠢 euro12.iloc[:,:7]13.选取除了最后3列之外的全部列
euro12.iloc[:,:-3]14.找到英格兰(England)、意大利(Italy)和俄罗斯(Russia)的射正率(Shooting Accuracy)
euro12.loc[euro12.Team.isin(['England','Italy','Russia']),['Team','Shooting Accuracy']] #loc可以用数字也可以直接名字,注意左边是选取的行,右边是列名
练习三:数据分组
1. 导入 Pandas
2. 从如下地址导入数据集drinks.csv
3. 将数据集存入一个名为drinks的数据框内
import pandas as pd drinks=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\drinks.csv') drinks4.哪个大陆(continent)平均消耗的啤酒(beer)更多?
drinks[['continent','beer_servings']].groupby(by='continent').mean().sort_values('beer_servings',ascending=False).head(1)5.打印出每个大陆(continent)的红酒消耗(wine_servings)的描述性统计值
drinks[['continent','wine_servings']].groupby(by='continent').describe() #答案是drinks.groupby('continent').wine_servings.describe()6.打印出每个大陆每种酒类别的消耗平均值
drinks.groupby(by='continent')[['beer_servings','spirit_servings','wine_servings','total_litres_of_pure_alcohol']].mean()7.打印出每个大陆每种酒类别的消耗中位数median()
drinks.groupby(by='continent')[['beer_servings','spirit_servings','wine_servings','total_litres_of_pure_alcohol']].median()8.打印出每个大陆对spirit饮品消耗的平均值,最大值和最小值
drinks.groupby(by='continent')['spirit_servings'].agg(['mean','max','min'])
练习四:Apply函数
1. 导入 Pandas,numpy
2. 从如下地址导入数据集US_Crime_Rates_1960_2014.csv
3. 将数据集存入一个名为crime的数据框内
import pandas as pd import numpy as np crime=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\US_Crime_Rates_1960_2014.csv') crime4. 每一列(column)的数据类型是什么样的?
crime.dtypes #答案写的crime.info() #dtypes属性和info()函数结果如下,info()信息更多5.将Year的数据类型转换为 datetime64
crime.Year=pd.to_datetime(crime.Year,format='%Y') #用pd的to_datetime()方法,后面加上format是因为datetime会有年月日时分秒,这样就只有年月日了6.将列Year设置为数据框的索引
crime.Year=crime.set_index('Year',drop=True) #设置索引,并且删除原来列7.删除名为Total的列
del crime['Total']8.按照每十年Year对数据框进行分组并求和
crime.resample('10Y').sum() #需要多了解resample(),答案写的是10AS,发现10Y也可以用9.何时是美国历史上生存最危险的年代?
crime.idxmax(0) #找出x轴上每个最大值的索引,前提是已经把年份设置成索引了,结果如下
练习五:合并
1. 导入必要的库
2.按照如下的元数据内容创建数据框
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]}3.将上述的数据框分别命名为data1, data2, data3
data1=pd.DataFrame(raw_data_1) data2=pd.DataFrame(raw_data_2) data3=pd.DataFrame(raw_data_3)4.将data1和data2两个数据框按照行的维度进行合并,命名为all_data
all_data=pd.concat([data1,data2]) all_data5.将data1和data2两个数据框按照列的维度进行合并,命名为all_data_col
all_data_col=pd.concat([data1,data2],axis=1) all_data_col6.打印data3
7.按照subject_id的值对all_data和data3作合并
pd.merge(all_data,data3,on='subject_id')8.对data1和data2按照subject_id作连接
pd.merge(data1,data2,on='subject_id')9.找到 data1 和 data2 合并之后的所有匹配结果
pd.merge(data1,data2,on='subject_id',how='outer')
练习六:统计
1. 导入必要的库
2.从以下地址导入数据wind.data
pd.read_table('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\wind.data',sep = "\s+") #如果文本中的分割符既有空格又有制表符('\t'),sep参数用'\s+'3.将数据作存储并且设置前三列为合适的索引
#前三列看上去是年月日,想要将他转换成日期形式,可用read_table的parse_dates()参数 data=pd.read_table('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\wind.data',sep='\s+', parse_dates = [[0,1,2]]) data4.2061年?我们真的有这一年的数据?创建一个函数并用它去修复这个bug
import datetime def fix_year(x): year=x.year-100 if x.year>1979 else x.year return datetime.date(year,x.month,x.day) data['Yr_Mo_Dy']=data['Yr_Mo_Dy'].apply(fix_year) data5.将日期设为索引,注意数据类型,应该是datetime64[ns]
data['Yr_Mo_Dy']=pd.to_datetime(data['Yr_Mo_Dy']) data=data.set_index('Yr_Mo_Dy') data6.对应每一个location,一共有多少数据值缺失
data.isnull().sum(0) #对应每一天的话,是data.isnull().sum(1)7.对应每一个location,一共有多少完整的数据值
data.notnull().sum(0)8.对于全体数据,计算风速的平均值
data.mean().mean() #data.mean()是算行的平均值9.创建一个名为loc_stats的数据框去计算并存储每个location的风速最小值,最大值,平均值和标准差
loc_stats=pd.DataFrame() loc_stats['max']=data.max() loc_stats['min']=data.min() loc_stats['mean']=data.mean() loc_stats['std']=data.std() loc_stats10.创建一个名为day_stats的数据框去计算并存储所有location的每天的风速最小值,最大值,平均值和标准差
day_stats=pd.DataFrame() day_stats['min']=data.min(1) day_stats['max']=data.max(1) day_stats['mean']=data.mean(1) day_stats['std']=data.std(1) day_stats11.对于每一个location,计算一月份的平均风速
data[data.index.month==1].mean()12.对于数据记录按照年为频率取样(没说清楚,答案写的是取出每年一月一号的数据)
#按照答案的理解 data[(data.index.month==1)&(data.index.day==1)] #我的理解是每年取平均 data.resample('MS').mean()13.对于数据记录按照月为频率取样
#同上,答案的理解是每年每月的1号的数据 data[data.index.day==1] #每月取平均的话 data.resample('M').mean()
练习七:可视化(先不做)
练习八:创建数据库(还算简单,先不做)
练习九:时间序列
1. 导入必要的库
2.从以下地址导入数据Apple_stock.csv
3.将数据框命名为apple
apple=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\Apple_stock.csv')4.查看每一列的数据类型
apple.dtypes5.将Date这个列转换为datetime类型
apple.Date=pd.to_datetime(apple['Date'])6.将Date设置为索引
apple=apple.set_index('Date') apple7.有重复的日期吗?
apple.index.is_unique8.将index设置为升序
apple.sort_index()9.找到每个月的最后一个交易日(business day)
#自己写的 a1=apple.resample('BM').sum() a1.index10.数据集中最早的日期和最晚的日期相差多少天?
(apple.index.max()-apple.index.min()).days11.在数据中一共有多少个月?
a2=apple.resample('M').count() len(a2.index)12.按照时间顺序可视化Adj Close值
练习十:删除数据
1. 导入必要的库
2.从以下地址导入数据iris.csv
3.将数据框命名为iris
iris=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\iris.csv')4.创建数据框的列名称为'sepal_length','sepal_width', 'petal_length', 'petal_width', 'class'
iris=pd.read_csv('C:\\Users\\Xpeng\\Desktop\\python_resource\\pandas_exercise\\exercise_data\\iris.csv',names=['sepal_length','sepal_width', 'petal_length', 'petal_width', 'class'])5.数据框中有缺失值吗?
iris.isnull().sum() #没有6.将列petal_length的第10到19行设置为缺失值
iris.loc[10:20,'petal_length']=np.nan iris.head(20)7.将缺失值全部替换为1.0
iris=iris.fillna('1.0') iris.head(20)8.删除列class
del iris['class']9.将数据框前三行设置为缺失值
iris.iloc[:3,:]=np.nan10.删除有缺失值的行
iris=iris.dropna(how='any')11.重新设置索引
iris.reset_index(drop=True)