天天看點

Python資料分析與挖掘所需的Pandas常用知識

前言

Pandas基于兩種資料類型:series與dataframe。

一個series是一個一維的資料類型,其中每一個元素都有一個标簽。series類似于Numpy中元素帶标簽的數組。其中,标簽可以是數字或者字元串。

一個dataframe是一個二維的表結構。Pandas的dataframe可以存儲許多種不同的資料類型,并且每一個坐标軸都有自己的标簽。你可以把它想象成一個series的字典項。

一、讀取csv檔案為dataframe

二、dataframe的資料概況

三、取列資料

四、取行資料

五、取某一單元格資料

六、缺失值處理

七、歸一化處理

八、排序

九、索引重新編号

十、求均值

十一、矢量化操作(批量操作)

十二、透視表

Pandas很好的一點是,可以操作表檔案。輸出為dataframe格式,這點很nice。 使用pandas.read_csv()讀取csv檔案,輸出為dataframe格式資料。 這裡資料data.csv資料集下載下傳自百度地圖。

import pandas as pd

filepath = r'C:/Users/lenovo/Desktop/20180108-百度地圖/20180108-百度地圖/data.csv'

df = pd.read_csv(filepath)

#為了友善,我隻顯示三行,其實結果并不是這樣子

print(df)

檢測下資料格式

#檢測下資料格式是否為DataFrame

print(type(df))

#輸出class 'pandas.core.frame.DataFrame

我們想知道資料如下知識:

展示dataframe前後幾條記錄

顯示dataframe的列名字

檢視dataframe的次元情況(幾行幾列)

#展示前兩條記錄(根據需要顯示條數)

df.head(2)

print(df.head(2))

#展示後三條記錄

df.tail(3)

print(df.tail(3))

#展示列名

col_names = df.columns

print(col_names)

#檢視下col_names格式

type(col_names)

#将col_names轉化為list

col_list = col_names.tolist()

col_list

使用dataframe[column_name],傳回series格式資料。 series序列資料類似于list,你可以近似等同于list。 隻不過傳回資料中會多一列index索引。如下面的左側數字序号

#這裡我們一列,如取Name列資料

df['Name'][:5]

print(df['Name'][:5])

#這裡傳回的資料還是dataframe格式,為了友善也隻顯示前幾條記錄

cols = ['name', 'province_name', 'city_name', 'city_code', 'area', 'addr']

df[cols]

print(df[cols])

ix[row, col] 中括号中第一個參數row是行參數,你想選擇的資料行數。 第二個參數col是列參數,選擇你想要的列資料項。

#第一行所有資料

df.ix[0, :]

print(df.ix[0, :])

#第一行的某幾列資料

col = ['Survived', 'Pclass', 'Sex']

df.ix[0, col]

print(df.ix[0, col])

#取多行資料,所有列。這裡我選擇前5行,所有列.

#這裡是不是很像切片操作。python基礎很重要

df.ix[:5, :]

print(df.ix[:5, :])

#取多行,某幾列

df.ix[:5, col]

print(df.ix[:5, col])

取第一行第一列。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

#按照列處理缺失值(為顯示友善,隻顯示前5行)

df.dropna(axis=0)

#對指定列進行缺失值處理

df.dropna(axis=0,subset=['Sex','Age'])

資料集中,不同的列的資料可能在不同量級,如果直接進行分析。模型會認為數字大的影響力大,數字小的影響力小。 最終結果可能導緻量級小的變量被剔除出模型。是以需要将資料歸一化,變成同一量級的資料,這就是歸一化操作。 在這裡我們隻對一列操作下,其餘列也需要操作,但為了友善,這裡隻寫一列的歸一化處理。

處理步驟:

1.選取該列的最大值

max_value = df[col].max()

2.該列所有值均除以max_value

這裡要注意,我們會用到pandas特性,矢量化操作,也就是可以對一個清單進行批量同樣的操作。

#這裡我們選Fare列進行歸一化,先看下Fare的資料

#為了友善顯示,隻顯示了前10個

df['Fare']

#這裡我們選Fare列進行歸一化

max_value = df['Fare'].max()

max_value

#歸一化,并将資料傳入新列new_Fare

df['new_Fare']=df['Fare']/max_value

df['new_Fare']

df.sort_values(col,inplace,ascending)

col          對col列進行排序

inplace      布爾型值,是否原地操作。

            True時,操作結果覆寫掉原資料,原資料被修改

            False時,建立一個新資料,原資料未被修改

ascending    布爾型值。升序降序。 False降序,True升序

#對Age列進行降序操作,不修改原始資料

df.sort_values('Age',inplace=False,ascending=False)

将排序後的索引重新排序

df.reset_index(drop)

drop    為布爾型值,True表示修改原始資料的索引。

                 False保留原始資料索引序列。

df.reset_index(drop=False)

df.mean()

df['Age'].mean()

一般對如list樣式的資料批量操作,需要寫循環,但是這樣費時費力。 pandas基于numpy,可進行矢量化操作,一行就能完成複雜的循環語句,而且運作效率還很高。

#對Age列批量加10

df['Age']+10).head

#對Age列批量減20

df['Age']-10

df.pivot_table(index=col1,values=col2,aggfunc='numpy函數')

圍繞index參數列,分析各個col2,aggfunc是np函數,當然這裡的aggfunc也可以是自定義函數。

#分析平均年齡對對生存率的影響。

#0為死亡,1為生存。

#這裡我們發現年齡對生存率有影響。

import numpy as np

df.pivot_table(index='Survived',values='Age',aggfunc=np.mean)

#分析倉位等級對生存率影響。0為死亡,1為生存。

#倉位為一等二等三等分别取值1,2,3

#一等艙最進階。我們發現倉位等級對生存也有影響。

df.pivot_table(index='Survived',values='Pclass',aggfunc=np.mean)

pandas會在網頁中尋找任何符合html表形式的資料,并将其轉化WieDataFrame對象作為傳回結果

pandas使用方法

#header=1 顯示列名;header=0,不顯示

pd.read_html(url,header)

實戰代碼開始

url = "http://hz.house.ifeng.com/detail/2014_10_28/50087618_1.shtml"

data = pd.read_html(url,header=1)

print(data)

注意啊,這裡得到的資料格式是list。

[      序号       樓盤名稱    城區 簽約套數 預定套數 簽約面積(㎡)簽約均價(元/㎡)

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        複地黃龍和山   西湖     0     1         0㎡        0.0

88  89.0         中糧方圓府   下城     0     1         0㎡        0.0

89  90.0          東方銘樓   下沙     0    16         0㎡        0.0

90   NaN         總計簽約:  主城區   216    40  21755.55㎡        NaN

[91 rows x 7 columns],    2

df.to_json()

而隻要知道資料存儲在DataFrame中,一切都變的簡單起來。 比如我很希望資料以json記形式輸出,很簡單!這隻是一行代碼的事情。

#data資料是list類型,要先轉化為dataframe

df = pd.DataFrame(data)

df.to_json(orient='records')

df.to_csv()

dataframe對象,還可以将資料輸出儲存為csv檔案

#encoding為gbk編碼,可以在office excel中看中文不亂嗎

df.to_csv('data.csv',encoding='gbk')

轉自:https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247485475&idx=1&sn=81f5a117335181a9e846b84e20bd921a&chksm=ec5ed75edb295e48538eea0e7c28d4bbbffdd3405784d3019db5f65592424ef4a0fab18f73ab&mpshare=1&scene=23&srcid=0208YIogc0ZyLNbYf1ISMvMx#rd