1. 程式人生 > 其它 >Pandas入門教程

Pandas入門教程

大家好,我是皮皮。其實這個pandas教程,卷的很嚴重了,才哥,小P等人寫了很多的文章,這篇文章是粉絲【古月星辰】投稿,自己學習過程中整理的一些基礎資料,整理成文,這裡發出來給大家一起學習。

Pandas入門

本文主要詳細介紹了pandas的各種基礎操作,原始檔為zlJob.csv,可以私我進行獲取,下圖是原始資料部分一覽。

pandas官網:

https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html

目錄結構:

  • 生成資料表
  • 資料表基本操作
  • 資料清洗
  • 時間序列

一.生成資料表

1.1 資料讀取

一般情況下我們得到的資料型別大多數csv或者excel檔案,這裡僅給出csv,

  • 讀取csv檔案
pd.read_csv()
  • 讀取excel檔案
pd.read_excel()

1.2 資料的建立

pandas可以建立兩種資料型別,series和DataFrame;

  • 建立Series(類似於列表,是一個一維序列)

  • s = pd.Series([1,2,3,4,5])

  • 建立dataframe(類似於excel表格,是二維資料)

  • df2 = pd.DataFrame(
    { "A": 1.0,
    "B": pd.Timestamp("20130102"),
    "C": pd.Series(1, index=list(range(4)), dtype="float32"),
    "D": np.array([3] * 4, dtype="int32"),
    "E": pd.Categorical(["test", "train", "test", "train"]),
    "F": "foo",
    })

二、資料表的基本操作

2.1 資料檢視

  • 檢視前五行
  • data.head() # head() 引數表示前幾行,預設為5
  • 基本資訊
data.shape

(990, 9)

data.dtypes
  • 檢視空值
data['name'].isnull() # 檢視name這一列是否有空值

2.2 行和列的操作

  • 新增一列
dic = {'name':'前端開發','salary':2萬-2.5萬,  'company':'上海科技有限公司',  'adress':'上海','eduBack':'本科','companyType':'民營',  'scale':1000-10000人,'info':'小程式'}

df = pd.Series(dic)

df.name = 38738

data = data.append(df)

data.tail()

結果:

  • 刪除一行
data = data.drop([990])
  • 新增一列
data  = data["xx"] = range(len(data))
  • 刪除一列
data = data.drop('序號',axis=1)

axis表示軸向,axis=1,表示縱向(刪除一列)

2.3 索引操作

  • loc
  • loc主要是基於標籤(label)的,包括行標籤(index)和列標籤(columns),即行名稱和列名稱,可以使用df.loc[index_name,col_name],選擇指定位置的資料,其它的用法有:
  • 1. 使用單個標籤data.loc[10,'salary']

    9千-1.3萬2. 單個標籤的list

    data.loc[:,'name'][:5]
    3. 標籤的切片物件data.loc[:,['name','salary']][:5]
  • iloc

iloc是基於位置的索引,利用元素在各個軸上的索引序號進行選擇,序號超出範圍會產生IndexError,切片時允許序號超過範圍,用法包括:

1. 使用整數

data.iloc[2] # 取出索引為2的那一行

2. 使用列表或陣列

data.iloc[:5]

3. 切片物件

data.iloc[:5,:4] # 以,分割,前面切片5行,後面切片4列

常見的方法就如上所示。

2.4 層次化索引

  • series層次化索引
s = pd.Series(np.arange(1,10),index=[list('aaabbccdd'),[1,2,3,1,2,3,1,2,3]])
  • dataframe層次化索引
df = pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['X','X','Y'],['m','n','t']])

層次化索引應用於當目標資料的特徵值很多時,我們需要對多個特徵進行分析。

三、資料預處理

3.1 缺失值處理

首先建立一個簡單的表格:

df = pd.DataFrame({'state':['a','b','c','d'],'year':[1991,1992,1993,1994],'pop':[6.0,7.0,8.0,np.NaN]})

df

結果如下:

判斷缺失值

df['pop'].isnull()

結果如下:

填充缺失值

df['pop'].fillna(0,inplace=True) # 使用0填充缺失值

df

刪除缺失值

data.dropna(how = 'all')    # 傳入這個引數後將只丟棄全為缺失值的那些行 

結果如下:

當然還有其他情況:

data.dropna(axis = 1)       # 丟棄有缺失值的列(一般不會這麼做,這樣會刪掉一個特徵)

data.dropna(axis=1,how="all")   # 丟棄全為缺失值的那些列

data.dropna(axis=0,subset = ["Age", "Sex"])   # 丟棄‘Age’和‘Sex’這兩列中有缺失值的行

這裡就不做一一展示(原理都是一樣的)

3.2 字元處理

  • 清除字元空格
df['A']=df['A'].map(str.stri())
  • 大小寫轉換
df['A'] = df['A'].str.lower()

3.3 重複值處理

  • 刪除後面出現的重複值
df['A'] = df['A'].drop_duplicates() # 某一列後出現重複資料被清除
  • 刪除先出現的重複值
df['A'] = df['A'].drop_duplicates(keep=last) # # 某一列先出現重複資料被清除
  • 資料替換
df['A'].replace('sh','shanghai') # 同於字串替換

四、資料表操作

分組

groupby

group = data.groupby(data['name']) # 根據職位名稱進行分組

group

根據職位名稱進行分組:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000265DBD335F8>

得到一個物件,我們可以去進行平均值,總和計算;

當然了可以根據多個特徵進行分組,也是沒有問題的;

聚合

concat():

pd.concat(

    objs,

    axis=0,

    join="outer",

    ignore_index=False,

    keys=None,

    levels=None,

    names=None,

    verify_integrity=False,

    copy=True, 

)

官網引數解釋如下:

  • objs: Series 或 DataFrame 物件的序列或對映。如果傳遞了 dict,排序後的鍵將用作keys引數,除非傳遞,在這種情況下將選擇值(見下文)。任何 None 物件都將被靜默刪除,除非它們都是 None 在這種情況下將引發 ValueError 。
  • axis :{0, 1, …},預設為 0。要沿其連線的軸。
  • join: {'inner', 'outer'}, 預設為 'outer'。如何處理其他軸上的索引。外部用於聯合,內部用於交集。
  • ignore_index: 布林值,預設為 False。如果為 True,則不要使用串聯軸上的索引值。結果軸將被標記為 0, …, n - 1。如果您在連線軸沒有有意義的索引資訊的情況下連線物件,這將非常有用。請注意,其他軸上的索引值在連線中仍然有效。
  • keys: 序列,預設無。使用傳遞的鍵作為最外層構建分層索引。如果通過了多個級別,則應包含元組。
  • levels: 序列列表,預設無。用於構建 MultiIndex 的特定級別(唯一值)。否則,它們將從金鑰中推斷出來。
  • names: 列表,預設無。生成的分層索引中級別的名稱。
  • verify_integrity: 布林值,預設為 False。檢查新的串聯軸是否包含重複項。相對於實際的資料串聯,這可能非常昂貴。
  • copy: 布林值,預設為真。如果為 False,則不要不必要地複製資料。

測試:

df1 = pd.DataFrame(

    {

        "A": ["A0", "A1", "A2", "A3"],

        "B": ["B0", "B1", "B2", "B3"],

        "C": ["C0", "C1", "C2", "C3"],

        "D": ["D0", "D1", "D2", "D3"],

    },

    index=[0, 1, 2, 3],

)

df2 = pd.DataFrame(

    {

        "A": ["A4", "A5", "A6", "A7"],

        "B": ["B4", "B5", "B6", "B7"],

        "C": ["C4", "C5", "C6", "C7"],

        "D": ["D4", "D5", "D6", "D7"],

    },

    index=[4, 5, 6, 7],

)

df3 = pd.DataFrame(

    {

        "A": ["A8", "A9", "A10", "A11"],

        "B": ["B8", "B9", "B10", "B11"],

        "C": ["C8", "C9", "C10", "C11"],

        "D": ["D8", "D9", "D10", "D11"],

    },

    index=[8, 9, 10, 11],

)

frames = [df1, df2, df3]

result = pd.concat(frames)

result

結果如下:

merge()

pd.merge(

    left,

    right,

    how="inner",

    on=None,

    left_on=None,

    right_on=None,

    left_index=False,

    right_index=False,

    sort=True,

    suffixes=("_x", "_y"),

    copy=True,

    indicator=False,

    validate=None,

)

這裡給出常用引數解釋:

  • left:一個 DataFrame 或命名的 Series 物件;right:另一個 DataFrame 或命名的 Series 物件;
  • on: 要加入的列或索引級別名稱;
  • left_on:左側 DataFrame 或 Series 的列或索引級別用作鍵。可以是列名稱、索引級別名稱或長度等於 DataFrame 或 Series 長度的陣列;right_on:來自正確 DataFrame 或 Series 的列或索引級別用作鍵。可以是列名稱、索引級別名稱或長度等於 DataFrame 或 Series 長度的陣列
  • left_index:如果True,則使用左側 DataFrame 或 Series 中的索引(行標籤)作為其連線鍵;right_index:與left_index正確的 DataFrame 或 Series 的用法相同;
  • how: 'left', 'right', 'outer', 之一'inner'。預設為inner. 有關每種方法的更詳細說明,請參見下文。

測試:

left = pd.DataFrame(

    {

        "key": ["K0", "K1", "K2", "K3"],

        "A": ["A0", "A1", "A2", "A3"],

        "B": ["B0", "B1", "B2", "B3"],

    }

)

right = pd.DataFrame(

    {

        "key": ["K0", "K1", "K2", "K3"],

        "C": ["C0", "C1", "C2", "C3"],

        "D": ["D0", "D1", "D2", "D3"],

    }

)

result = pd.merge(left, right, on="key")

result

結果如下:

相同的欄位是'key',所以指定on='key',進行合併。

五、時間序列

5.1 生成一段時間範圍

date = pd.period_range(start='20210913',end='20210919')

date

輸出結果:

PeriodIndex(['2021-09-13', '2021-09-14', '2021-09-15', '2021-09-16', '2021-09-17', '2021-09-18', '2021-09-19'], dtype='period[D]', freq='D')

5.2 時間序列在pandas中的應用

index = pd.period_range(start='20210913',end='20210918')

df = pd.DataFrame(np.arange(24).reshape((6,4)),index=index)

df

輸出結果:

六、總結

本文基於原始檔zlJob.csv,進行了部分pandas操作,演示了pandas庫常見的資料處理操作,由於pandas功能複雜,具體詳細講解請參見官網