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


前言

Pandas基於兩種數據類型:series與dataframe。html

一個series是一個一維的數據類型,其中每個元素都有一個標籤。series相似於Numpy中元素帶標籤的數組。其中,標籤能夠是數字或者字符串。python

一個dataframe是一個二維的表結構。Pandas的dataframe能夠存儲許多種不一樣的數據類型,而且每個座標軸都有本身的標籤。你能夠把它想象成一個series的字典項。json

1、讀取csv文件爲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)複製代碼

檢測下數據格式bash

#檢測下數據格式是否爲DataFrame
print(type(df))
#輸出class 'pandas.core.frame.DataFrame複製代碼

2、 DataFrame數據概況

咱們想知道數據以下知識:函數

  • 展現dataframe先後幾條記錄ui

  • 顯示dataframe的列名字編碼

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

2.1展現dataframe先後幾行spa

#展現前兩條記錄(根據須要顯示條數)
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複製代碼

3、從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])複製代碼

4、從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])複製代碼

4.2取多行數據

#取多行數據,全部列。這裏我選擇前5行,全部列.
#這裏是否是很像切片操做。python基礎很重要
df.ix[:5, :]
print(df.ix[:5, :])
​
#取多行,某幾列
df.ix[:5, col]
print(df.ix[:5, col])複製代碼

5、取某一單元格數據

取第一行第一列。df.ix[0,0] 第三行第七列。df.ix[2,6]

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'])
複製代碼

7、歸一化處理

數據集中,不一樣的列的數據可能在不一樣量級,若是直接進行分析。模型會認爲數字大的影響力大,數字小的影響力小。 最終結果可能致使量級小的變量被剔除出模型。所以須要將數據歸一化,變成同一量級的數據,這就是歸一化操做。 在這裏咱們只對一列操做下,其他列也須要操做,但爲了方便,這裏只寫一列的歸一化處理。

處理步驟:
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']
複製代碼

8、排序

df.sort_values(col,inplace,ascending)
col          對col列進行排序
inplace      布爾型值,是否原地操做。
             True時,操做結果覆蓋掉原數據,原數據被修改
             False時,新建一個新數據,原數據未被修改
ascending    布爾型值。升序降序。 False降序,True升序

#對Age列進行降序操做,不修改原始數據
df.sort_values('Age',inplace=False,ascending=False)
複製代碼

9、索引從新

將排序後的索引從新排序
df.reset_index(drop)
drop    爲布爾型值,True表示修改原始數據的索引。
                  False保留原始數據索引序列。

df.reset_index(drop=False)
複製代碼

10、求平均值

10.1全部列的平均值信息

df.mean()
複製代碼

10.2 單個列的平均值

df['Age'].mean()
複製代碼

11、矢量化操做(批量操做)

通常對如list樣式的數據批量操做,須要寫循環,可是這樣費時費力。 pandas基於numpy,可進行矢量化操做,一行就能完成複雜的循環語句,並且運行效率還很高。

#對Age列批量加10
df['Age']+10).head

#對Age列批量減20
df['Age']-10
複製代碼

12、透視表

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中的表格數據

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.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
複製代碼

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')複製代碼
相關文章
相關標籤/搜索