上周分享了數(shù)據(jù)分析用到的一個庫:Numpy 庫坟桅,今天分享一個比 Numpy 更高效的庫:pandas,它可以對數(shù)據(jù)進行導(dǎo)入蕊蝗、清洗仅乓、處理、統(tǒng)計和輸出匿又。pandas 是基于 Numpy 庫的,可以說建蹄,pandas 庫就是為數(shù)據(jù)分析而生的碌更。
環(huán)境
語言:Python 3.6
安裝&導(dǎo)入
用 pip 命令快速安裝 pandas 庫。
pip install pandas
安裝完后再編輯器中導(dǎo)入洞慎。
import pandas as pd
讀取文件
讀取你的 excel 文件痛单,并另存為 csv 格式的文件。
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('test.xlsx'))
df.to_csv('test1.csv')
print(df)
讀取過程中可能會報錯劲腿,提示你缺少 xlrd 模塊的情況旭绒,用 pip 命令安裝即可。
打印出讀取到的數(shù)據(jù)焦人,我們發(fā)現(xiàn)挥吵,文件中單元格為空的數(shù)據(jù)以 NAN 代替了。
當然花椭,也可以直接讀取文件并打印忽匈,不給參數(shù)的話默認只打印前 5 行數(shù)據(jù)。以我之前爬取的熱門歌手文件為例矿辽。
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
print(df.head(8))
打印結(jié)果如下:
歌手名字 歌手ID
0 周杰倫 6452
1 陳奕迅 2116
2 薛之謙 5781
3 林俊杰 3684
4 李榮浩 4292
5 張學(xué)友 6460
6 楊宗緯 6066
7 許巍 5770
清洗數(shù)據(jù)
我們知道丹允,從事數(shù)據(jù)分析工作的,80% 的時間都花在數(shù)據(jù)清洗上面袋倔,因為我們從各個渠道獲取的信息格式不統(tǒng)一雕蔽,我們需要對他們進行清洗。
清洗數(shù)據(jù)主要內(nèi)容如下:
刪除 DataFrame 中的不必要列和行宾娜。
重命名 columns 為一組更易識別的標簽批狐。
更改數(shù)據(jù)格式。
去除數(shù)據(jù)間空格或者特定字符前塔。
去除重復(fù)的行贾陷。
查找空值。
刪除行或者列
我們還是以剛才歌手信息為例嘱根,為了看刪除效果髓废,我加了一列信息:性別,下面只顯示部分信息该抒。
歌手名字 歌手ID 性別
0 周杰倫 6452 男
1 陳奕迅 2116 男
2 薛之謙 5781 男
3 林俊杰 3684 男
4 李榮浩 4292 男
5 張學(xué)友 6460 男
6 楊宗緯 6066 男
7 許巍 5770 男
刪除性別這一列慌洪。
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df.drop(columns=['性別'])
print(df1)
執(zhí)行后發(fā)現(xiàn)剛加的「性別」這一列已被刪除顶燕。
刪除某一行,比如刪除李榮浩這一行信息冈爹,我們通過上面可以知道這一行的 index 是 4涌攻。
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df.drop(index=['李榮浩'])
print(df1)
執(zhí)行后結(jié)果如下,我們發(fā)現(xiàn)频伤,index 為 4 的這一行信息已被刪除恳谎。
歌手名字 歌手ID 性別
0 周杰倫 6452 男
1 陳奕迅 2116 男
2 薛之謙 5781 男
3 林俊杰 3684 男
5 張學(xué)友 6460 男
6 楊宗緯 6066 男
7 許巍 5770 男
重命名列名
用 rename 方法將列名修改成自己需要的列名,比如歌手名字換成 SName憋肖。
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df.rename(columns={'歌手名字': 'SName'}, inplace=True)
print(df)
更改數(shù)據(jù)格式
用 astype 更改數(shù)據(jù)格式因痛。
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df['歌手ID'].astype('str')
刪除數(shù)據(jù)間空格
df = DataFrame(pd.read_excel('歌手.xlsx'))
df['歌手名字'] = df['歌手名字'].map(str.strip) # 刪除左右兩邊空格
df['歌手名字'] = df['歌手名字'].map(str.lstrip) # 刪除左邊空格
df['歌手名字'] = df['歌手名字'].map(str.rstrip) # 刪除右邊空格
去除重復(fù)的行
用自帶的方法一行代碼可以搞定。
df = DataFrame(pd.read_excel('歌手.xlsx'))
df = df.drop_duplicates()
查找空值
我們可以用 isnull 方法查找數(shù)據(jù)中的空值或者 NAN岸更,返回的是 Boolean 類型鸵膏,F(xiàn)alse 表示不是空值藻肄,True 表示空值陋葡。
df = DataFrame(pd.read_excel('歌手.xlsx'))
df = df.isnull()
print(df)
為了展示效果,我執(zhí)行前去掉了第 5 行的信息埃仪,所以第 5 行出現(xiàn)一個 True评肆。
歌手名字 歌手ID
0 False False
1 False False
2 False False
3 False False
4 True False
數(shù)據(jù)統(tǒng)計
上周講 Numpy 庫時也講到了對數(shù)據(jù)的統(tǒng)計债查,計算數(shù)據(jù)最大值、最小值瓜挽、平均值攀操、方差、標準差等秸抚。pandas 也可以做這些工作速和,而且 pandas 中的 describe 可以直接顯示這個數(shù)據(jù)。
我們先創(chuàng)建一個科目成績的數(shù)據(jù)剥汤。
df = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
print(df)
數(shù)據(jù)如下:
subject data
0 語 90
1 數(shù) 91
2 外 92
3 理 93
4 化 94
我們用 describe 方法直接顯示這些統(tǒng)計數(shù)據(jù)颠放。
df = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
print(df.describe())
結(jié)果如下:
data
count 5.000000
mean 92.000000
std 1.581139
min 90.000000
25% 91.000000
50% 92.000000
75% 93.000000
max 94.000000
多表合并
如果我們有多個數(shù)據(jù)表,我們需要對他進行合并處理吭敢。以下這些知識點和 SQL 很相似碰凶,如果你對 SQL 語句熟悉的話,以下很容易理解
對相同的列進行合并
df1 = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['語', '數(shù)', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, on='subject')
print(df3)
兩個表中鹿驼,語數(shù)外是相同的欲低,進行合并,結(jié)果如下:
subject data_x data_y
0 語 90 90
1 數(shù) 91 91
2 外 92 92
內(nèi)連接
也就是兩個數(shù)據(jù)表中的交集部分畜晰。
df1 = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['語', '數(shù)', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='inner')
print(df3)
結(jié)果顯示兩個表中相同的數(shù)據(jù)砾莱。
subject data
0 語 90
1 數(shù) 91
2 外 92
左連接
以左表為主,右表只顯示交集部分的數(shù)據(jù)凄鼻。
df1 = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['語', '數(shù)', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='left')
print(df3)
執(zhí)行結(jié)果:
subject data
0 語 90
1 數(shù) 91
2 外 92
3 理 93
4 化 94
右連接
以右表為主腊瑟,左表只顯示交集部分的數(shù)據(jù)聚假。
df1 = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['語', '數(shù)', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='right')
print(df3)
執(zhí)行結(jié)果:
subject data
0 語 90
1 數(shù) 91
2 外 92
3 史 93
4 地 94
全連接
顯示兩個表數(shù)據(jù)的并集。
df1 = DataFrame({'subject': ['語', '數(shù)', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['語', '數(shù)', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='outer')
print(df3)
執(zhí)行結(jié)果:
subject data
0 語 90
1 數(shù) 91
2 外 92
3 理 93
4 化 94
5 史 93
6 地 94
pandas 庫的對于數(shù)據(jù)分析的基本用法就介紹到這里闰非。