pandas练习---100题-和鲸kesci版

mac2024-03-24  69

https://www.kesci.com/home/project/59e77a636d213335f38daec2/code 题目来源于此网站,数据可以从此网站上下载。 觉得pandas和numpy的知识点都很琐碎,所以简单看了一下,开始做题。 这题目有些和答案写的不一样,有些题目出得模棱两可,就按照自己的想法写了。

 

练习一:探索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.columns

7.数据集的索引是怎样的

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']   #结果是Series

5.有多少球队参与了2012欧洲杯?

euro12['Team'].nunique()

6.该数据集中一共有多少列(columns)?

euro12.shape[1]

7.将数据集中的列Team, Yellow Cards和Red Cards单独存为一个名叫discipline的数据框

discipline=euro12[['Team','Yellow Cards','Red Cards']] discipline

8.对数据框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') drinks

4.哪个大陆(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') crime

4. 每一列(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_data

5.将data1和data2两个数据框按照列的维度进行合并,命名为all_data_col

all_data_col=pd.concat([data1,data2],axis=1) all_data_col

6.打印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]]) data

4.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) data

5.将日期设为索引,注意数据类型,应该是datetime64[ns]

data['Yr_Mo_Dy']=pd.to_datetime(data['Yr_Mo_Dy']) data=data.set_index('Yr_Mo_Dy') data

6.对应每一个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_stats

10.创建一个名为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_stats

11.对于每一个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.dtypes

5.将Date这个列转换为datetime类型

apple.Date=pd.to_datetime(apple['Date'])

6.将Date设置为索引

apple=apple.set_index('Date') apple

7.有重复的日期吗?

apple.index.is_unique

8.将index设置为升序

apple.sort_index()

9.找到每个月的最后一个交易日(business day)

#自己写的 a1=apple.resample('BM').sum() a1.index

10.数据集中最早的日期和最晚的日期相差多少天?

(apple.index.max()-apple.index.min()).days

11.在数据中一共有多少个月?

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.nan

10.删除有缺失值的行

iris=iris.dropna(how='any')

11.重新设置索引

iris.reset_index(drop=True)

 

 

最新回复(0)