Pandas數據分析練手題(十題)

數據集下載地址:https://github.com/Rango-2017/Pandas_exercisesgit

----------------------------------------------------------------------------------------------------------------------github

 

1 - 開始瞭解你的數據api

探索Chipotle快餐數據

-- 將數據集存入一個名爲chipo的數據框內
-- 查看前10行內容
-- 數據集中有多少個列(columns)?
-- 打印出所有的列名稱
-- 數據集的索引是怎樣的?
-- 被下單數最多商品(item)是什麼?
-- 在item_name這一列中,一共有多少種商品被下單?
-- 在choice_description中,下單次數最多的商品是什麼?
-- 一共有多少商品被下單?
-- 將item_price轉換爲浮點數
-- 在該數據集對應的時期內,收入(revenue)是多少?
-- 在該數據集對應的時期內,一共有多少訂單?
-- 每一單(order)對應的平均總價是多少?app

import pandas as pd
#將數據集存入一個名爲chipo的數據框內
chipo = pd.read_csv('chipotle.tsv',sep='\t')

#查看前10行內容
chipo.head(10)

#數據集中有多少個列(columns)?
chipo.shape[1]

#打印出所有的列名稱
chipo.columns

#數據集的索引是怎樣的?
chipo.index

#被下單數最多商品(item)是什麼?
chipo[['item_name','quantity']].groupby(by=['item_name']).sum().sort_values(by=['quantity'],ascending=False)

#在item_name這一列中,一共有多少種商品被下單?
chipo.item_name.nunique()

#在choice_description中,下單次數最多的商品是什麼?
#chipo[['choice_description','quantity']].groupby(by=['choice_description']).sum().sort_values(by=['quantity'],ascending=False)
chipo['choice_description'].value_counts().head()

#一共有多少商品被下單?
chipo['quantity'].sum()

#將item_price轉換爲浮點數
#貨幣符號後取起
chipo['item_price'] = chipo['item_price'].apply(lambda x: float(x[1:]))

#在該數據集對應的時期內,收入(revenue)是多少?
(chipo['quantity'] * chipo['item_price']).sum()

#在該數據集對應的時期內,一共有多少訂單?
chipo['order_id'].nunique()

#每一單(order)對應的平均總價是多少?
chipo['item_price_sum'] = chipo['quantity'] * chipo['item_price']
(chipo[['order_id','item_price_sum']].groupby(by=['order_id']).sum()).mean()

 

2 - 數據過濾與排序

探索2012歐洲盃數據

-- 將數據集命名爲euro12
-- 只選取 Goals 這一列
-- 有多少球隊參與了2012歐洲盃?
-- 該數據集中一共有多少列(columns)?
-- 將數據集中的列Team, Yellow Cards和Red Cards單獨存爲一個名叫discipline的數據框
-- 對數據框discipline按照先Red Cards再Yellow Cards進行排序
-- 計算每一個球隊拿到的黃牌數的平均值
-- 找到進球數Goals超過6的球隊數據
-- 選取以字母G開頭的球隊數據
-- 選取前7列
-- 選取除了最後3列以外的所有列
-- 找到英格蘭(England)、意大利(Italy)和俄羅斯(Russia)的射正率(Shooting Accuracy)函數

import pandas as pd
#將數據集命名爲euro12
euro12 = pd.read_csv('C:\\Users\\Administrator\\Desktop\\Euro2012.csv')

#只選取 Goals 這一列
euro12.Goals

#有多少球隊參與了2012歐洲盃?
euro12.Team.nunique()

#該數據集中一共有多少列(columns)?
euro12.shape[1]

#將數據集中的列Team, Yellow Cards和Red Cards單獨存爲一個名叫discipline的數據框
discipline = euro12[['Team','Yellow Cards','Red Cards']]

#對數據框discipline按照先Red Cards再Yellow Cards進行排序
discipline.sort_values(by=['Red Cards','Yellow Cards'],ascending = False)

#計算拿到的黃牌數的平均值
euro12['Yellow Cards'].mean()

#找到進球數Goals超過6的球隊數據
euro12[euro12.Goals>6]

#選取以字母G開頭的球隊數據
euro12[euro12.Team.str.startswith('G')]

#選取前7列
euro12.iloc[:,0:7]

#選取除了最後3列以外的所有列
euro12.iloc[:,0:-3]

#找到英格蘭(England)、意大利(Italy)和俄羅斯(Russia)的射正率(Shooting Accuracy)
euro12.loc[euro12['Team'].isin(['England','Italy','Russia']),['Team','Shooting Accuracy']]

#loc:經過行標籤索引數據
#iloc:經過行號索引行數據
#ix:經過行標籤或行號索引數據(基於loc和iloc的混合)

 

練習3-數據分組

探索酒類消費數據

-- 將數據框命名爲drinks
-- 哪一個大陸(continent)平均消耗的啤酒(beer)更多?
-- 打印出每一個大陸(continent)的紅酒消耗(wine_servings)的描述性統計值
-- 打印出每一個大陸每種酒類別的消耗平均值
-- 打印出每一個大陸每種酒類別的消耗中位數
-- 打印出每一個大陸對spirit飲品消耗的平均值,最大值和最小值ui

import pandas as pd
#將數據框命名爲drinks
drinks = pd.read_csv('C:\\Users\\Administrator\\Desktop\\drinks.csv')

#哪一個大陸(continent)平均消耗的啤酒(beer)更多?
(drinks[['continent','beer_servings']].groupby(by=['continent']).mean().sort_values(by=['beer_servings'],ascending =False)).head(1)

#打印出每一個大陸(continent)的紅酒消耗(wine_servings)的描述性統計值
drinks.groupby('continent').wine_servings.describe()

#打印出每一個大陸每種酒類別的消耗平均值
drinks.groupby('continent').mean()

#打印出每一個大陸每種酒類別的消耗中位數
drinks.groupby('continent').median()

#打印出每一個大陸對spirit飲品消耗的平均值,最大值和最小值
drinks.groupby('continent').spirit_servings.describe()

練習4-Apply函數

探索1960 - 2014 美國犯罪數據

-- 將數據框命名爲crime
-- 每一列(column)的數據類型是什麼樣的?
-- 將Year的數據類型轉換爲 datetime64
-- 將列Year設置爲數據框的索引
-- 刪除名爲Total的列
-- 按照Year(每十年)對數據框進行分組並求和
-- 什麼時候是美國曆史上生存最危險的年代?spa

import pandas as pd
#將數據框命名爲drinks
crime = pd.read_csv('C:\\Users\\Administrator\\Desktop\\US_Crime_Rates_1960_2014.csv',index_col=0)

#每一列(column)的數據類型是什麼樣的?
crime.info()

#將Year的數據類型轉換爲 datetime64
crime.Year = pd.to_datetime(crime.Year,format='%Y')

#將列Year設置爲數據框的索引
crime = crime.set_index('Year',drop=True)

#刪除名爲Total的列
del crime['Total']
crime.head()

#按照Year(每十年)對數據框進行分組並求和
crimes = crime.resample('10AS').sum()
population = crime.resample('10AS').max() #人口是累計數,不能直接求和
crimes['Population'] = population

#什麼時候是美國曆史上生存最危險的年代?
crime.idxmax(0)#最大值的索引值

 

練習5-合併

探索虛擬姓名數據

-- 建立DataFrame
-- 將上述的DataFrame分別命名爲data1, data2, data3
-- 將data1和data2兩個數據框按照行的維度進行合併,命名爲all_data
-- 將data1和data2兩個數據框按照列的維度進行合併,命名爲all_data_col
-- 打印data3
-- 按照subject_id的值對all_data和data3做合併
-- 對data1和data2按照subject_id做鏈接
-- 找到 data1 和 data2 合併以後的全部匹配結果rest

import pandas as pd
import numpy as np
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]}
#建立DataFrame
#將上述的DataFrame分別命名爲data1, data2, data3
data1 = pd.DataFrame(raw_data_1)
data2 = pd.DataFrame(raw_data_2)
data3 = pd.DataFrame(raw_data_3)

#將data1和data2兩個數據框按照行的維度進行合併,命名爲all_data
all_data = pd.concat([data1,data2],axis=0)

#將data1和data2兩個數據框按照列的維度進行合併,命名爲all_data_col
all_data_col = pd.concat([data1,data2],axis=1)

#打印data3
data3

#按照subject_id的值對all_data和data3做合併
pd.merge(all_data,data3,on='subject_id')

#對data1和data2按照subject_id做內鏈接
pd.merge(data1,data2,on='subject_id',how='inner')

#找到 data1 和 data2 合併以後的全部匹配結果
pd.merge(data1,data2,on='subject_id',how='outer')

練習6-統計

探索風速數據

-- 將數據做存儲而且設置前三列爲合適的索引
-- 2061年?咱們真的有這一年的數據?建立一個函數並用它去修復這個bug
-- 將日期設爲索引,注意數據類型,應該是datetime64[ns]
-- 對應每個location,一共有多少數據值缺失
-- 對應每個location,一共有多少完整的數據值
-- 對於全體數據,計算風速的平均值
-- 建立一個名爲loc_stats的數據框去計算並存儲每一個location的風速最小值,最大值,平均值和標準差
-- 建立一個名爲day_stats的數據框去計算並存儲全部location的風速最小值,最大值,平均值和標準差
-- 對於每個location,計算一月份的平均風速
-- 對於數據記錄按照年爲頻率取樣
-- 對於數據記錄按照月爲頻率取樣code

import pandas as pd
import datetime
#將數據做存儲而且設置前三列爲合適的索引
df = pd.read_csv('C:\\Users\\Administrator\\Desktop\\wind.data',sep='\s+',parse_dates=[[0,1,2]])

#2061年?咱們真的有這一年的數據?建立一個函數並用它去修復這個bug
def fix_century(x):
    year = x.year - 100 if x.year>1999 else x.year
    return datetime.date(year,x.month,x.day)

df['Yr_Mo_Dy'] = df['Yr_Mo_Dy'].apply(fix_century)

#將日期設爲索引,注意數據類型,應該是datetime64[ns]
df['Yr_Mo_Dy'] = pd.to_datetime(df['Yr_Mo_Dy'])
df = df.set_index('Yr_Mo_Dy')

#對應每個location,一共有多少數據值缺失
df.isnull().sum()

#對應每個location,一共有多少完整的數據值
df.shape[1] - df.isnull().sum()

#對於全體數據,計算風速的平均值
df.mean().mean()

#建立一個名爲loc_stats的數據框去計算並存儲每一個location的風速最小值,最大值,平均值和標準差
loc_stats = pd.DataFrame()
loc_stats['min'] = df.min()
loc_stats['max'] = df.max()
loc_stats['mean'] = df.mean()
loc_stats['std'] = df.std()

#建立一個名爲day_stats的數據框去計算並存儲全部天的風速最小值,最大值,平均值和標準差
day_stats = pd.DataFrame()
day_stats['min'] = df.min(axis=1)
day_stats['max'] = df.max(axis=1)
day_stats['mean'] = df.mean(axis=1)
day_stats['std'] = df.std(axis=1)

#對於每個location,計算一月份的平均風速
df['date'] = df.index

df['year'] = df['date'].apply(lambda df: df.year)
df['month'] = df['date'].apply(lambda df: df.month)
df['day'] = df['date'].apply(lambda df: df.day)

january_winds = df.query('month ==1')       #query等同於df[df.month==1]
january_winds.loc[:,'RPT':'MAL'].mean()

#對於數據記錄按照年爲頻率取樣
df.query('month ==1 and day == 1')

#對於數據記錄按照月爲頻率取樣
df.query('day == 1')

練習7-可視化

探索泰坦尼克災難數據

-- 將數據框命名爲titanic
-- 將PassengerId設置爲索引
-- 繪製一個展現男女乘客比例的扇形圖
-- 繪製一個展現船票Fare, 與乘客年齡和性別的散點圖
-- 有多少人生還?
-- 繪製一個展現船票價格的直方圖orm

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

#將數據框命名爲titanic
titanic = pd.read_csv('C:\\Users\\Administrator\\Desktop\\train.csv')

#將PassengerId設置爲索引
titanic = titanic.set_index('PassengerId')

#繪製一個展現男女乘客比例的扇形圖
Male = (titanic.Sex == 'male').sum()
Female = (titanic.Sex == 'female').sum()

proportions = [Male,Female]

plt.pie(proportions, labels=['Male','Female'],shadow=True,
        autopct='%1.1f%%',startangle=90,explode=(0.15,0))
plt.axis('equal')
plt.title('Sex Proportion')
plt.tight_layout()
plt.show()

#繪製一個展現船票Fare, 與乘客年齡和性別的散點圖
lm = sns.lmplot(x='Age',y='Fare', data=titanic,hue='Sex',fit_reg=False)
lm.set(title='Fare x Age')

#設置座標軸取值範圍
axes = lm.axes
axes[0,0].set_ylim(-5,)
axes[0,0].set_xlim(-5,85)

#有多少人生還?
titanic.Survived.sum()

#繪製一個展現船票價格的直方圖
df = titanic.Fare.sort_values(ascending = False)

plt.hist(df,bins = (np.arange(0,600,10)))
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.title('Fare Payed Histrogram')
plt.show()

練習8-建立數據框

探索Pokemon數據

 

-- 建立一個數據字典
-- 將數據字典存爲一個名叫pokemon的數據框中
-- 數據框的列排序是字母順序,請從新修改成name, type, hp, evolution, pokedex這個順序
-- 添加一個列place['park','street','lake','forest']
-- 查看每一個列的數據類型

import pandas as pd
#建立一個數據字典
raw_data = {"name": ['Bulbasaur', 'Charmander','Squirtle','Caterpie'],
            "evolution": ['Ivysaur','Charmeleon','Wartortle','Metapod'],
            "type": ['grass', 'fire', 'water', 'bug'],
            "hp": [45, 39, 44, 45],
            "pokedex": ['yes', 'no','yes','no']                        
            }
#將數據字典存爲一個名叫pokemon的數據框中
pokemon =  pd.DataFrame(raw_data)

#數據框的列排序是字母順序,請從新修改成name, type, hp, evolution, pokedex這個順序
pokemon = pokemon[['name', 'type', 'hp', 'evolution', 'pokedex']]

#添加一個列place['park','street','lake','forest']
pokemon['place'] = ['park','street','lake','forest']

#看每一個列的數據類型
pokemon.dtypes

練習9-時間序列

探索Apple公司股價數據

-- 讀取數據並存爲一個名叫apple的數據框
-- 查看每一列的數據類型
-- 將Date這個列轉換爲datetime類型
-- 將Date設置爲索引
-- 有重複的日期嗎?
-- 將index設置爲升序
-- 找到每月的最後一個交易日(business day)
-- 數據集中最先的日期和最晚的日期相差多少天?
-- 在數據中一共有多少個月?
-- 按照時間順序可視化Adj Close值

 

import pandas as pd
#讀取數據並存爲一個名叫apple的數據框
apple = pd.read_csv('C:\\Users\\Administrator\\Desktop\\appl_1980_2014.csv')

#查看每一列的數據類型
apple.dtypes

#將Date這個列轉換爲datetime類型
apple.Date = pd.to_datetime(apple.Date)

#將Date設置爲索引
apple = apple.set_index('Date')

#有重複的日期嗎?
apple.index.is_unique

#將index設置爲升序
apple = apple.sort_index(ascending = True)

#找到每月的最後一個交易日(business day)
apple_month = apple.resample('BM').mean()
apple_month.head()

#數據集中最先的日期和最晚的日期相差多少天?
(apple.index.max() - apple.index.min()).days

#在數據中一共有多少個月?
len(apple_month)

#按照時間順序可視化Adj Close值
apple['Adj Close'].plot(title = 'Apple Stock').get_figure().set_size_inches(9,5)

練習10-刪除數據

探索Iris紙鳶花數據

-- 將數據集存成變量iris
-- 建立數據框的列名稱['sepal_length','sepal_width', 'petal_length', 'petal_width', 'class']
-- 數據框中有缺失值嗎?
-- 將列petal_length的第10到19行設置爲缺失值
-- 將petal_lengt缺失值所有替換爲1.0
-- 刪除列class
-- 將數據框前三行設置爲缺失值
-- 刪除有缺失值的行
-- 從新設置索引

import pandas as pd
import numpy as np
#讀取數據並存爲一個名叫apple的數據框
iris = pd.read_csv('C:\\Users\\Administrator\\Desktop\\iris.data')

#建立數據框的列名稱['sepal_length','sepal_width', 'petal_length', 'petal_width', 'class']
iris.columns = ['sepal_length','sepal_width', 'petal_length', 'petal_width', 'class']

#數據框中有缺失值嗎?
iris.isnull().sum()

#將列petal_length的第10到19行設置爲缺失值
iris['petal_length'].loc[10:19]=np.nan

#將petal_lengt缺失值所有替換爲1.0
iris.petal_length.fillna(1 , inplace=True)

#刪除列class
del iris['class']

#將數據框前三行設置爲缺失值
iris.loc[0:2,:]=np.nan

#刪除有缺失值的行
iris = iris.dropna(how='any')

#從新設置索引
iris = iris.reset_index(drop = True)#加上drop參數,原有索引就不會成爲新的列

 


 

參考至科賽網

https://www.kesci.com/home/project/59e77a636d213335f38daec2

相關文章
相關標籤/搜索