前言
Pandas基于兩種數(shù)據(jù)類型:series與dataframe。
一個series是一個一維的數(shù)據(jù)類型棺克,其中每一個元素都有一個標簽。series類似于Numpy中元素帶標簽的數(shù)組朝抖。其中糊闽,標簽可以是數(shù)字或者字符串梳玫。
一個dataframe是一個二維的表結(jié)構(gòu)。Pandas的dataframe可以存儲許多種不同的數(shù)據(jù)類型右犹,并且每一個坐標軸都有自己的標簽提澎。你可以把它想象成一個series的字典項。
Pandas常用知識
一念链、讀取csv文件為dataframe
二盼忌、dataframe的數(shù)據(jù)概況
三、取列數(shù)據(jù)
四掂墓、取行數(shù)據(jù)
五谦纱、取某一單元格數(shù)據(jù)
六、缺失值處理
七君编、歸一化處理
八跨嘉、排序
九、索引重新編號
十吃嘿、求均值
十一祠乃、矢量化操作(批量操作)
十二、透視表
一兑燥、讀取csv文件為dataframe
Pandas很好的一點是亮瓷,可以操作表文件。輸出為dataframe格式贪嫂,這點很nice寺庄。 使用pandas.read_csv()讀取csv文件艾蓝,輸出為dataframe格式數(shù)據(jù)力崇。 這里數(shù)據(jù)data.csv數(shù)據(jù)集下載自百度地圖斗塘。
import pandas as pd
filepath = r'C:/Users/lenovo/Desktop/20180108-百度地圖/20180108-百度地圖/data.csv'
df = pd.read_csv(filepath)
#為了方便,我只顯示三行亮靴,其實結(jié)果并不是這樣子
print(df)
檢測下數(shù)據(jù)格式
#檢測下數(shù)據(jù)格式是否為DataFrame
print(type(df))
#輸出
class 'pandas.core.frame.DataFrame
二馍盟、 DataFrame數(shù)據(jù)概況
我們想知道數(shù)據(jù)如下知識:
展示dataframe前后幾條記錄
顯示dataframe的列名字
查看dataframe的維度情況(幾行幾列)
2.1展示dataframe前后幾行
#展示前兩條記錄(根據(jù)需要顯示條數(shù))
df.head(2)
print(df.head(2))
#展示后三條記錄
df.tail(3)
print(df.tail(3))
2.2展示dataframe列名
#展示列名
col_names = df.columns
print(col_names)
#查看下col_names格式
type(col_names)
#將col_names轉(zhuǎn)化為list
col_list = col_names.tolist()
col_list
三、從dataframe中取列數(shù)據(jù)
使用dataframe[column_name]茧吊,返回series格式數(shù)據(jù)贞岭。 series序列數(shù)據(jù)類似于list,你可以近似等同于list搓侄。 只不過返回數(shù)據(jù)中會多一列index索引瞄桨。如下面的左側(cè)數(shù)字序號
3.1 取一列數(shù)據(jù)
#這里我們一列,如取Name列數(shù)據(jù)
df['Name'][:5]
print(df['Name'][:5])
3.2取多列數(shù)據(jù)
#這里返回的數(shù)據(jù)還是dataframe格式讶踪,為了方便也只顯示前幾條記錄
cols = ['name', 'province_name', 'city_name', 'city_code', 'area', 'addr']
df[cols]
print(df[cols])
四芯侥、從dataframe中取行數(shù)據(jù)(記錄)
ix[row, col] 中括號中第一個參數(shù)row是行參數(shù),你想選擇的數(shù)據(jù)行數(shù)乳讥。 第二個參數(shù)col是列參數(shù)柱查,選擇你想要的列數(shù)據(jù)項。
4.1取一行數(shù)據(jù)
#第一行所有數(shù)據(jù)
df.ix[0, :]
print(df.ix[0, :])
#第一行的某幾列數(shù)據(jù)
col = ['Survived', 'Pclass', 'Sex']
df.ix[0, col]
print(df.ix[0, col])
4.2取多行數(shù)據(jù)
#取多行數(shù)據(jù)云石,所有列唉工。這里我選擇前5行,所有列.
#這里是不是很像切片操作汹忠。python基礎(chǔ)很重要
df.ix[:5, :]
print(df.ix[:5, :])
#取多行淋硝,某幾列
df.ix[:5, col]
print(df.ix[:5, col])
五、取某一單元格數(shù)據(jù)
取第一行第一列宽菜。df.ix[0,0] 第三行第七列奖地。df.ix[2,6]
六、缺失值處理
缺失值一般標記為NaN,處理辦法如下
df.dropna(axis)
默認直接使用df.dropna()
axis=1,按照行進行缺失值處理
axis=0赋焕,按照列進行缺失值處理
df.dropna(axis=0,subset)
axis=0,按照列方向處理subset中的列缺失值
subset=[column] subset含有一個或多個列名的的list
6.1按照行進行缺失值處理
#為了顯示方便参歹,只顯示前五行。
#axis=1表示按照行方向處理NAN
df.dropna(axis=1)
6.2按照列進行缺失值處理
#按照列處理缺失值(為顯示方便隆判,只顯示前5行)
df.dropna(axis=0)
#對指定列進行缺失值處理
df.dropna(axis=0,subset=['Sex','Age'])
七犬庇、歸一化處理
數(shù)據(jù)集中,不同的列的數(shù)據(jù)可能在不同量級侨嘀,如果直接進行分析臭挽。模型會認為數(shù)字大的影響力大,數(shù)字小的影響力小咬腕。 最終結(jié)果可能導(dǎo)致量級小的變量被剔除出模型欢峰。因此需要將數(shù)據(jù)歸一化,變成同一量級的數(shù)據(jù),這就是歸一化操作纽帖。 在這里我們只對一列操作下宠漩,其余列也需要操作,但為了方便懊直,這里只寫一列的歸一化處理扒吁。
處理步驟:
1.選取該列的最大值
max_value = df[col].max()
2.該列所有值均除以max_value
這里要注意,我們會用到pandas特性室囊,矢量化操作雕崩,也就是可以對一個列表進行批量同樣的操作。
#這里我們選Fare列進行歸一化融撞,先看下Fare的數(shù)據(jù)
#為了方便顯示盼铁,只顯示了前10個
df['Fare']
#這里我們選Fare列進行歸一化
max_value = df['Fare'].max()
max_value
#這里我們選Fare列進行歸一化
max_value = df['Fare'].max()
max_value
#歸一化,并將數(shù)據(jù)傳入新列new_Fare
df['new_Fare']=df['Fare']/max_value
df['new_Fare']
八尝偎、排序
df.sort_values(col,inplace,ascending)
col 對col列進行排序
inplace 布爾型值捉貌,是否原地操作。
True時冬念,操作結(jié)果覆蓋掉原數(shù)據(jù)趁窃,原數(shù)據(jù)被修改
False時,新建一個新數(shù)據(jù)急前,原數(shù)據(jù)未被修改
ascending 布爾型值醒陆。升序降序。 False降序裆针,True升序
#對Age列進行降序操作刨摩,不修改原始數(shù)據(jù)
df.sort_values('Age',inplace=False,ascending=False)
九、索引重新
將排序后的索引重新排序
df.reset_index(drop)
drop 為布爾型值世吨,True表示修改原始數(shù)據(jù)的索引澡刹。
False保留原始數(shù)據(jù)索引序列。
df.reset_index(drop=False)
十耘婚、求平均值
10.1所有列的平均值信息
df.mean()
10.2 單個列的平均值
df['Age'].mean()
十一罢浇、矢量化操作(批量操作)
一般對如list樣式的數(shù)據(jù)批量操作,需要寫循環(huán)沐祷,但是這樣費時費力嚷闭。 pandas基于numpy,可進行矢量化操作赖临,一行就能完成復(fù)雜的循環(huán)語句胞锰,而且運行效率還很高。
#對Age列批量加10
df['Age']+10).head
#對Age列批量減20
df['Age']-10
十二兢榨、透視表
df.pivot_table(index=col1,values=col2,aggfunc='numpy函數(shù)')
圍繞index參數(shù)列嗅榕,分析各個col2顺饮,aggfunc是np函數(shù),當(dāng)然這里的aggfunc也可以是自定義函數(shù)凌那。
#分析平均年齡對對生存率的影響兼雄。
#0為死亡,1為生存案怯。
#這里我們發(fā)現(xiàn)年齡對生存率有影響君旦。
import numpy as np
df.pivot_table(index='Survived',values='Age',aggfunc=np.mean)
#分析倉位等級對生存率影響澎办。0為死亡嘲碱,1為生存。
#倉位為一等二等三等分別取值1局蚀,2麦锯,3
#一等艙最高級。我們發(fā)現(xiàn)倉位等級對生存也有影響琅绅。
df.pivot_table(index='Survived',values='Pclass',aggfunc=np.mean)
pandas提取html中的表格數(shù)據(jù)
andas會在網(wǎng)頁中尋找任何符合html表形式的數(shù)據(jù)扶欣,并將其轉(zhuǎn)化WieDataFrame對象作為返回結(jié)果
Code
pandas使用方法
import pandas as pd
#header=1 顯示列名;header=0千扶,不顯示
pd.read_html(url,header)
實戰(zhàn)代碼開始
import pandas as pd
url = "http://hz.house.ifeng.com/detail/2014_10_28/50087618_1.shtml"
data = pd.read_html(url,header=1)
print(data)
注意啊料祠,這里得到的數(shù)據(jù)格式是list。
[ 序號 樓盤名稱 城區(qū) 簽約套數(shù) 預(yù)定套數(shù) 簽約面積(㎡) 簽約均價(元/㎡)
0 1.0 龍湖春江酈城 濱江 18 0 2178.61 23757.0
1 2.0 海威錢塘之星 濱江 13 0 629.55㎡ 17398.0
2 3.0 大家運河之星 拱墅 12 0 1052.72㎡ 10457.0
3 4.0 保利城市果嶺 下沙 8 0 743.05㎡ 10457.0
.. ... ... ... ... ... ... ...
85 86.0 廣宇錦繡桃源 拱墅 1 0 86.44㎡ 12473.0
86 87.0 景瑞申花壹號院 拱墅 1 0 89.18㎡ 21529.0
87 88.0 復(fù)地黃龍和山 西湖 0 1 0㎡ 0.0
88 89.0 中糧方圓府 下城 0 1 0㎡ 0.0
89 90.0 東方銘樓 下沙 0 16 0㎡ 0.0
90 NaN 總計簽約: 主城區(qū) 216 40 21755.55㎡ NaN
[91 rows x 7 columns], 2
DataFrame對象
df.to_json()
而只要知道數(shù)據(jù)存儲在DataFrame中澎羞,一切都變的簡單起來髓绽。 比如我很希望數(shù)據(jù)以json記形式輸出,很簡單妆绞!這只是一行代碼的事情顺呕。
import pandas as pd
data = pd.read_html(url,header=1)
#data數(shù)據(jù)是list類型,要先轉(zhuǎn)化為dataframe
df = pd.DataFrame(data)
df.to_json(orient='records')
df.to_csv()
dataframe對象括饶,還可以將數(shù)據(jù)輸出保存為csv文件
import pandas as pd
data = pd.read_html(url,header=1)
df = pd.DataFrame(data)
#encoding為gbk編碼株茶,可以在ofiice excell中看中文不亂嗎
df.to_csv('data.csv',encoding='gbk')