1. 程式人生 > >Python數據分析與挖掘所需的Pandas常用知識

Python數據分析與挖掘所需的Pandas常用知識

columns 列表 元素 其中 標簽 數據 shtml 導致 lenovo

Python數據分析與挖掘所需的Pandas常用知識

前言
Pandas基於兩種數據類型:series與dataframe。
一個series是一個一維的數據類型,其中每一個元素都有一個標簽。series類似於Numpy中元素帶標簽的數組。其中,標簽可以是數字或者字符串。
一個dataframe是一個二維的表結構。Pandas的dataframe可以存儲許多種不同的數據類型,並且每一個坐標軸都有自己的標簽。你可以把它想象成一個series的字典項。

Pandas常用知識

一、讀取csv文件為dataframe
二、dataframe的數據概況
三、取列數據
四、取行數據
五、取某一單元格數據
六、缺失值處理
七、歸一化處理
八、排序
九、索引重新編號
十、求均值
十一、矢量化操作(批量操作)
十二、透視表

一、讀取csv文件為dataframe

Pandas很好的一點是,可以操作表文件。輸出為dataframe格式,這點很nice。 使用pandas.read_csv()讀取csv文件,輸出為dataframe格式數據。 這裏數據data.csv數據集下載自百度地圖。

import pandas as pd
filepath = rC:/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的列名字

  • 查看dataframe的維度情況(幾行幾列)

2.1展示dataframe前後幾行

#展示前兩條記錄(根據需要顯示條數)
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轉化為list
col_list 
= col_names.tolist() col_list

三、從dataframe中取列數據

使用dataframe[column_name],返回series格式數據。 series序列數據類似於list,你可以近似等同於list。 只不過返回數據中會多一列index索引。如下面的左側數字序號

3.1 取一列數據

#這裏我們一列,如取Name列數據
df[Name][:5]
print(df[Name][:5])

3.2取多列數據

#這裏返回的數據還是dataframe格式,為了方便也只顯示前幾條記錄
cols = [name, province_name, city_name, city_code, area, addr]
df[cols]
print(df[cols])

四、從dataframe中取行數據(記錄)

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

4.1取一行數據

#第一行所有數據
df.ix[0, :]
print(df.ix[0, :])

#第一行的某幾列數據
col = [Survived, Pclass, Sex]
df.ix[0, col]
print(df.ix[0, col])

2取多行數據

#取多行數據,所有列。這裏我選擇前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

6.1按照行進行缺失值處理

#按照列處理缺失值(為顯示方便,只顯示前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

#這裏我們選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)

十、求平均值

10.1所有列的平均值信息

df.mean()

10.2 單個列的平均值

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,23
#一等艙最高級。我們發現倉位等級對生存也有影響。
df.pivot_table(index=Survived,values=Pclass,aggfunc=np.mean)

pandas提取html中的表格數據

pandas會在網頁中尋找任何符合html表形式的數據,並將其轉化WieDataFrame對象作為返回結果

Code

pandas使用方法

import pandas as pd

#header=1 顯示列名;header=0,不顯示
pd.read_html(url,header)

實戰代碼開始

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)

註意啊,這裏得到的數據格式是list。

[      序號       樓盤名稱    城區 簽約套數 預定套數 簽約面積(㎡)簽約均價(元/㎡)
0    1.0        龍湖春江酈城   濱江    18     0    2178.61    23757.0
1    2.0        海威錢塘之星   濱江    13     0    629.5517398.0
2    3.0        大家運河之星   拱墅    12     0   1052.7210457.0
3    4.0        保利城市果嶺   下沙     8     0    743.0510457.0
    ..   ...           ...  ...   ...   ...        ...        ...
85  86.0        廣宇錦繡桃源   拱墅     1     0     86.4412473.0
86  87.0       景瑞申花壹號院   拱墅     1     0     89.1821529.0
87  88.0        復地黃龍和山   西湖     0     1         00.0
88  89.0         中糧方圓府   下城     0     1         00.0
89  90.0          東方銘樓   下沙     0    16         00.0
90   NaN         總計簽約:  主城區   216    40  21755.55㎡        NaN

[91 rows x 7 columns],    2

DataFrame對象

df.to_json()

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

import pandas as pd

data = pd.read_html(url,header=1)
#data數據是list類型,要先轉化為dataframe
df = pd.DataFrame(data)
df.to_json(orient=records)

df.to_csv()

dataframe對象,還可以將數據輸出保存為csv文件

import pandas as pd

data = pd.read_html(url,header=1)
df = pd.DataFrame(data)
#encoding為gbk編碼,可以在office excel中看中文不亂嗎
df.to_csv(data.csv,encoding=gbk)

轉自:簡書專欄:https://www.jianshu.com/u/c1ab741ef52e

Python數據分析與挖掘所需的Pandas常用知識