天天看點

Python機器學習入門之Pandas

Panads簡介

Panads存在兩種結構:

1、Series:

類似于一維數組的對象,由一組資料以及一組資料與之對應的索引組成

索引(Index)在左,值(Values)在右

索引是自動建立,也可以自己指定

2、DataFrame:

是一個表格類型的資料,含有一組有序的列,每列可以是不同的類型。

DataFrame既有行索引也有列索引,可以看做是 Series 組成的字典

資料以二維的形式存放

索引對象不允許修改,但可以對索引進行全部替換

Panads簡單讀取

'''
import pandas as pd

'''
    Series
'''
ser = pd.Series([3, 4, 5, 6, 7, 8, 9])
print("左邊是索引,右邊是值:\n", ser)

# 擷取索引 和 值
print("擷取到的索引:", ser.index)
print("擷取到的值:", ser.values)

# 通過 索引 擷取 值
print("通過索引擷取值:", ser[6])

# 通過 dict 建構 Series  head()返會全部
year = {2015: 15.6, 2017: 16.6, 2018: 19.9, 2019: 99.2, 2020: 99.2}
ser_year = pd.Series(year)
print("通過 dict 建構 Series:\n", ser_year)

# count 計算出現頻率
print("計算 value 值個數:", ser_year.count())

# unique 計算唯一值
print("計算 unique 唯一值:", ser_year.unique())

print("\n\n\n\n")
'''
    DataFrame:
        可以輸入給 DataFrame 構造器資料:
            1、二維 ndarray
            2、由數組、清單、元組組成的字典
            3、由 Series 組成的字典
            4、由字典組成的字典
            5、另外一個 DataFrame
'''
frame = pd.DataFrame([7, 2, 3, 4, 5, 6])
print("建立 DataFrame:", frame.head())

# 通過 dict 建構 DataFrame
dict_data = {
    "A": 1,
    "B": "2019-04-06",
    "C": pd.Series([1, 2, 3, 4]),
    "D": ["Py", "Java", "C", "D"],
    "E": "IT"
}
dict_frame = pd.DataFrame(dict_data)
print("通過 dict 字典形式 建立 DataFrame:", dict_frame)

# 通過索引擷取資料   dict_frame['D'] 擷取 dict_frame.D
print("通過索引,擷取資料(Series類型):", dict_frame['D'])

# 增加列資料
dict_frame['new'] = "我是新來的"
dict_frame['old'] = "我要被删除"
print("新增列:\n", dict_frame)

# 删除列
del dict_frame['old']
print("删除列:\n", dict_frame.head())

'''
    ix:
        dict_frame.ix[:,val]:選擇單個列
        dict_frame.ix[val1,val2]:同時選取行和列
        dict_frame.ix['A']:擷取指定索引對應的行資訊,ix表示索引字段
        dict_frame.ix[:,'A']:擷取所有行的指定A列的資料
'''
print("擷取指定列的資訊:", dict_frame.ix[:, 'A'])
print("擷取指定行的資訊:", dict_frame.ix[2])
print("同時擷取行列資訊", dict_frame.ix[2, 'A'])
print("擷取所有行的某列資訊", dict_frame.ix[:, "D"])

'''
    iloc:
        根據下标索引進行通路,可以通路對應的行和列元素
    loc:
        根據下标索引進行通路,可以通路對應的行和列資訊
    
    基本類似于 ix[]
'''
print("iloc 通路對應行和列資訊:", dict_frame.iloc[:, 3])
print(dict_frame.loc[:, :])

           

Panads簡單計算

import numpy as np
import pandas as pd

frame = pd.DataFrame(np.random.randint(10, size=(5, 4)), columns=['a', 'b', 'c', 'd'])
print("初始化資料:\n", frame)

'''
    常用操作:
        sum():求和
        mean():平均
        max():最大值
        min():最小值
        describe():産生多個統計資料(count,mean,std,min)
        query():類似 filter 過濾
        count 非Nan數量
        argmin、argmax 計算最大值或最小值對應的索引位置
        quantile 計算樣本的分位數(0-1)
        median 中位數
        mad 平均絕對離差
        var 樣本方差
        std 樣本的标準差
        skew 樣本值的偏度----正态分布的偏度為0
        kurt 樣本值的峰度------正态分布的峰度為3
        cumsum樣本值的累計和

    axis :
        預設為 0
        0 :列
        1 :行
    skipna:
        True:計算
        False:如果有 NaN 則值為 NaN
'''

# 修改部分值為 nan
frame.ix[0, 'a'] = np.nan
frame.ix[0, 'd'] = np.nan
frame.ix[2, 'c'] = np.nan
print("修改部分值為NaN:\n", frame)

# 求和
print("求和:\n", frame.sum(skipna=True))

# 求平均
print("求平均:\n", frame.mean(skipna=False))

# 求最值
print("最大值為:", frame.max(), "最小值為:", frame.min())
print("========================= \n")

# 生成多個統計資料
print("describe 産生多個統計資料:\n", frame.describe())

# query
df = pd.DataFrame(np.random.rand(10, 2), columns=list("ab"))

print("query : \n", df.query('a>b'))
           

Panads 函數運用(處理缺失值)

import pandas as pd
import numpy as np
'''
    處理缺失值:
        1、生成原始資料
        2、判斷資料是否缺失
        3、丢棄缺失資料
        4、填充缺失資料
    補充:
        applymap() :将函數應用到每個資料上
        apply() :将函數應用到行或列資料
        index() : 
            索引排序,預設升序排序 , ascending = False 為降序排序
            按 Index 排序  sort_index
            按 Values 排序 sort_values(by='colonum')
        
'''
'''
    1.生成原始資料:
        DataFrame可接受的資料:
            1、ndarray 二維數組
            2、由數組、清單、元組組成的字典
            3、由 Series 組成的字典
            4、由 字典 組成的字典
            5、另外一個 DataFrame
'''
df_data = pd.DataFrame([[1, 2, 3], [4., 5., np.nan], [np.nan, 6., np.nan], [6., 7., 8.]])
print("1、生成原資料:\n", df_data)

# 2、判斷資料是否确實
print("2、判斷資料是否為空:\n", df_data.isnull())

# 3、丢棄 缺失 資料   axis(0 -- 列,1 -- 行) :根據次元丢棄
print("3、丢棄缺失資料:\n", df_data.dropna())

# 4、填充缺失資料
print("4、填充缺失資料為 100.:\n", df_data.fillna(100.))

# applymap 将函數運用到所有的資料上
f2 = lambda x: x * x
print("applymap 将函數運用到所有的資料上:\n", df_data.applymap(f2))

# 使用apply應用行或列資料
f1 = lambda x: x.max()
print("apply應用行或列資料:\n", df_data.apply(f1))

# 排序
print("根據 Index 排序後的資料:\n", df_data.sort_index)
print("根據 Values 排序後的資料:\n", df_data.sort_values(by=2))
           

Panads 層級索引

'''
    層級索引:
        在輸入索引Index時,輸入了由兩個子list組成的list,第一個子list是外層索引,第二個list是内層索引。
'''
import pandas as pd
import numpy as np

ser = pd.Series(np.arange(1, 11, 1),
                index=[
                    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd'],
                    [0, 1, 2, 0, 1, 3, 0, 1, 2, 3]
                ])

print("層級索引原資料:\n", ser)
# 索引類型 MultiIndex
print("索引類别:", type(ser.index))

'''
    levels:
        表示兩個層級中分别有哪些标簽
    codes:
        每個位置分别是什麼标簽   
'''
print("列印索引:", ser.index)

'''
    選取子集:
        根據索引擷取資料:
            現在有兩層資料,當通過外層索引擷取資料的時候,可以直接利用外層索引标簽來擷取
            當要通過内層索引擷取資料的時候,在 list 中傳入兩個元素:
                前者表示要選取的外層索引
                後者表示要選取的内層索引
    常用于分組操作、透視表的生成等
'''
# 擷取外層資料
print("外層索引資料:\n", ser['b'])

# 擷取内層資料  前者表示外層索引,後者表示内層索引
print("内層索引資料:\n", ser[:, 1])

'''
    交換分層排序:
        swaplevel():交換内層與外層索引
'''
print("交換内層與外層索引:\n", ser.swaplevel())

'''
    交換并分層排序:
        sort_index():先對外層索引進行排序,再對内層索引進行排序,預設是升序
        sort_value():先對外層索引進行排序,再對内層索引進行排序,預設是升序
'''
print("交換并分層排序:\n",ser.swaplevel().sort_index())
           

繼續閱讀