Pandas數據處理+Matplotlib繪圖案例


利用pandas對數據進行預處理然后再使用matplotlib對處理后的數據進行數據可視化是數據分析中常用的方法。

第一組例子(星巴克咖啡店)

假如我們現在有這樣一組數據:星巴克在全球的咖啡店信息,如下圖所示。數據來源:starbucks_store_locations

starbucks_store_worldwide

店鋪總數排名前10的國家

# coding=utf-8
# 統計店鋪數排名前10的國家
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager

# 准備工作
font = font_manager.FontProperties(fname="/usr/share/fonts/truetype/wqy/wqy-microhei.ttc")
file_path = "./starbucks_store_worldwide.csv"
df = pd.read_csv(file_path)

# 處理數據
data1 = df.groupby(by="Country").count().sort_values(by="Brand", ascending=False)[:10]["Brand"]
_x = data1.index
_y = data1.values

# 畫圖
plt.figure(figsize=(10,8), dpi=80)
plt.bar(range(len(_x)), _y, width=0.5)

plt.xticks(range(len(_x)), _x)
plt.xlabel("國家", fontproperties=font)
plt.ylabel("店鋪數", fontproperties=font)
plt.title("星巴克咖啡店鋪數排行前10(國家)", fontproperties=font, size=20)
plt.show()

結果如圖:

星巴克咖啡店鋪數排行前10(國家)

中國店鋪數排名前20的城市

# coding=utf-8
# 統計中國店鋪數排名前20的城市
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager

font = font_manager.FontProperties(fname="/usr/share/fonts/truetype/wqy/wqy-microhei.ttc")
file_path = "./starbucks_store_worldwide.csv"
df = pd.read_csv(file_path)

# 處理數據
df = df[df["Country"] == "CN"]
data1 = df.groupby(by="City").count().sort_values(by="Brand", ascending=False)[:20]["Brand"]
_x = list(data1.index)
_y = list(data1.values)

# 畫圖
plt.figure(figsize=(20,8), dpi=80)

plt.bar(range(len(_x)), _y)
# 添加條形圖數值
for xx, yy in zip(range(len(_x)),_y):
    plt.text(xx, yy+5, str(yy), ha='center')

plt.xticks(range(len(_x)), _x, fontproperties=font)
plt.yticks(range(max(_y)+50)[::50])
plt.xlabel("城市", fontproperties=font)
plt.ylabel("店鋪數", fontproperties=font)
plt.title("中國星巴克咖啡店鋪數排行前20(城市)", fontproperties=font, size=20)

plt.show()

結果如圖:

中國星巴克咖啡店鋪數排行前20(城市)

第二組例子(世界排行前10000書籍信息)

假如我們現在有這樣一組數據:世界排行前10000書籍信息,如下圖所示。數據來源:books

books

各年份書籍平均評分

#  coding=utf-8

import pandas as pd
from matplotlib import pyplot as plt

file_path = "./books.csv"
pd.set_option('display.max_columns', 100)
df = pd.read_csv(file_path)

# 不同年份書籍的平均評分

# 去除NaN
data1 = df[pd.notnull(df["original_publication_year"])]
#
print(type(data1))
grouped = data1["average_rating"].groupby(by=data1["original_publication_year"]).mean()

print(grouped)

_x = grouped.index
_y = grouped.values

plt.figure(figsize=(20, 8), dpi=80)


plt.plot(range(len(_x)), _y)

plt.xticks(range(len(_x))[::15], _x[::15].astype(int), rotation=45)
plt.grid()
plt.show()

結果如圖:

各年份書籍平均分

由於公元前的年份書籍較少,每年只有一本,所以數據波動幅度會很大,越往后就會越趨於平穩

911緊急求救電話信息

這個案例不牽扯繪圖,但是這個案例中有個很重要的問題就是關於對數據進行遍歷的問題。數據來源:Emergency - 911 Calls

假如我們要讀取這個數據文件中各類求救電話的數量,應該怎么做呢?我們首先來看一下這個數據文件的基本信息。

# coding=utf-8

import pandas as pd
import numpy as np

file_path = "./911.csv"
pd.set_option('display.max_columns', 100)
df = pd.read_csv(file_path)

print(df.info())

結果如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 249737 entries, 0 to 249736
Data columns (total 9 columns):
lat          249737 non-null float64
lng          249737 non-null float64
desc         249737 non-null object
zip          219391 non-null float64
title        249737 non-null object
timeStamp    249737 non-null object
twp          249644 non-null object
addr         249737 non-null object
e            249737 non-null int64
dtypes: float64(3), int64(1), object(5)
memory usage: 17.1+ MB
None

Process finished with exit code 0

可以看到這個數據文件竟然有25萬行之多- -

我們再查看他的第一行信息:

print(df.head(1))

結果如下:

         lat        lng                                               desc  \
0  40.297876 -75.581294  REINDEER CT & DEAD END;  NEW HANOVER; Station ...   

       zip                   title            timeStamp          twp  \
0  19525.0  EMS: BACK PAINS/INJURY  2015-12-10 17:10:52  NEW HANOVER   

                     addr  e  
0  REINDEER CT & DEAD END  1  

Process finished with exit code 0

可以看到類型適合具體事項都歸類在了title里面,所以我們第一步首先要將類型和具體事項分隔開:

data1 = df["title"].str.split(": ").tolist()
# 這里我們直接對所得分類做了去重操作
data2 = set([i[0] for i in data1])

下面關鍵的一步,我們要統計各個分類下的求救電話數量。因為這個數據有25w行,所以如果像我之前的文章中去一行一行的遍歷,程序的速度就會變得非常慢。這里我們使用for循環來遍歷分類列表,則會快很多。

# 創建全0數組方便下一步的統計
a = pd.DataFrame(np.zeros((df.shape[0], len(data2))), columns=data2, dtype=int)
# 這一步就是將a中與原數據中相同索引行,但title中包含i類型求助信息的那個值置為1
for i in data2:
    a[i][df["title"].str.contains(i)] = 1

a_sum = a.sum(axis=0).sort_values(ascending=False)
print(a_sum)

結果如下:

EMS        124844
Traffic     87465
Fire        37432
dtype: int64


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM