機器學習三劍客之Pandas

Pandas的兩大核心數據結構

  • Series(一維數據)

Series

創建Series的方法

允許索引重複

  • DataFrame(多特徵數據,既有行索引,又有列索引)

DataFrame

索引方法

# 創建一個3行4列的DataFrame類型數據
data_3_4 = pd.DataFrame(np.arange(10, 22).reshape(3, 4))
# 打印數據
print(data_3_4)

# 打印第一行數據
print(data_3_4[:1])
# 打印第一列數據
print(data_3_4[:][0])
  • DataFrame的屬性

原始數據

DataFrame的屬性

# 讀取數據
result = pd.read_csv("./students_score.csv")
# 數據的形狀
result.shape
# 每列數據的 類型信息
result.dtypes
# 數據的維數
result.ndim
# 數據的索引(起/始/步長)
result.index
# 打印每一列 屬性的名稱
result.columns
# 將數據放到數組中顯示
result.values

整體查詢

# 打印前5個
print("-->前5個:")
print(result.head(5))
# 打印後5個
print("-->後5個:")
print(result.tail(5))
# 打印描述信息(實驗中好用)
print("-->描述信息:")
print(result.describe())

Panda數據讀取(以csv爲例)

pandas.read_csv(filepath_or_buffer, sep=",", names=None, usecols = None)

filepath_or_buffer : 文件路徑(本地路徑或url路徑)
sep: 分隔符
names: 列索引的名字
usecols: 指定讀取的列名

返回的類型: DataFrame  

讀取並返回數據

  • Dataframe通過布爾索引過濾數據

布爾索引

# 布爾索引(查詢) 找出年齡大於23歲的人
result[result["age"]>23]

小案例: 分析2006年至2016年1000部IMDB電影數據

2006年----2016年IMDB最受歡迎的1000部電影

評分降序排列

統計時長

IMDB_1000 = pd.read_csv("./IMDB-Movie-Data.csv")
# 獲取數據字段
print(IMDB_1000.dtypes)
# 根據1000部電影評分進行降序排列,參數ascending, 默認爲True(升序), 這裏爲False(降序)
IMDB_1000.sort_values(by="Rating", ascending=False)
# 時間最長的電影
IMDB_1000[IMDB_1000["Runtime (Minutes)"]==IMDB_1000["Runtime (Minutes)"].max()]
# 時間最短的電影
IMDB_1000[IMDB_1000["Runtime (Minutes)"]==IMDB_1000["Runtime (Minutes)"].min()]
# 電影時長平均值
IMDB_1000["Runtime (Minutes)"].mean()

數據處理

  • 存在缺失值, 直接刪除數據(刪除存在缺失值的樣本)

刪除存在缺失值的樣本

# 刪除存在缺失值的樣本
IMDB_1000.dropna()

不推薦的操作: 按列刪除缺失值爲IMDB_1000.dropna(axis=1)

  • 存在缺失值, 直接填充數據fillna

填充空缺值

使用平均值填充數據

# 爲一些電影缺失的總票房添加平均值
IMDB_1000["Revenue (Millions)"].fillna(IMDB_1000["Revenue (Millions)"].mean(), inplace=True)

小案例: 乳腺癌數據預處理 (在線獲取數據,並替換缺失符號爲標準缺失符號np.nan)

替換默認的缺失符號

各列命名

讀取原始數據

# 在線讀取數據,並按照說明文檔, 並對各列信息進行命名
bcw = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=["Sample code number","Clump Thickness","Uniformity of Cell Size","Uniformity of Cell Shape", "Marginal Adhesion","Single Epithelial Cell Size","Bare Nuclei","Bland Chromatin","Normal Nucleoli","Mitoses","Class:"])

預處理,把?替換爲np.nan

小案例: 日期格式轉換 數據來源

facebook

日期格式轉換

# 讀取前10行數據
train = pd.read_csv("./train.csv", nrows = 10)
# 將數據中的time轉換爲最小分度值爲秒(s)的計量單位
train["time"] = pd.to_datetime(train["time"], unit="s")
  • 從日期中拆分出新的列

新增列

# 新增列year, month, weekday
train["year"] = pd.DatetimeIndex(train["time"]).year
train["month"] = pd.DatetimeIndex(train["time"]).month
train["weekday"] = pd.DatetimeIndex(train["time"]).weekday

數據表的合併(merge)

數據

user_info.csv
user_id,姓名,age
1,徐三,23
2,徐四,22
3,寶兒,210
4,楚嵐,21
5,王也,24
6,諸葛青,21
7,天師,89
8,呂梁,24
9,夏禾,26
goods_info.csv
goods_id,goods_name
G10,三隻松鼠
G12,MacBook
G13,iPad
G14,iPhone
order_info.csv
order_id,use_id,goods_name
as789,1,三隻松鼠
sd567,2,MacBook
hj456,4,iPad

合併過程

# 讀取3張表
user_info = pd.read_csv("./user_info.csv")
order_info = pd.read_csv("./order_info.csv")
goods_info = pd.read_csv("./goods_info.csv")
# 合併三張表
u_o = pd.merge(user_info, order_info, how="left", on=["user_id", "user_id"])
u_o_g = pd.merge(u_o, goods_info, how="left", on=["goods_name", "goods_name"])
  • 建立交叉表(用於計算分組的頻率)

交叉表

# 交叉表, 表示出用戶姓名,和商品名之間的關係
user_goods = pd.crosstab(u_o_g["姓名"],u_o_g["goods_name"])

Pandas的分組和聚合(重要)

小案例: 星巴克全球分佈情況 數據來源

全球星巴克分佈情況

 

讀取全球星巴克的位置數據

每個國家星巴克的數量

每個國家每個省份星巴克的數量

starbucks = pd.read_csv("./directory.csv")
# 統計每個國家星巴克的數量
starbucks.groupby(["Country"]).count()
# 統計每個國家 每個省份 星巴克的數量
starbucks.groupby(["Country", "State/Province"]).count()
  • 全球各國星巴克數量排名

全球星巴克數量排名



作者:木子昭
鏈接:https://www.jianshu.com/p/7414364992e4
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章