1. 程式人生 > >Python 資料處理庫 pandas

Python 資料處理庫 pandas

核心資料結構

pandas最核心的就是SeriesDataFrame兩個資料結構。

名稱維度說明
Series 1維 帶有標籤的同構型別陣列
DataFrame 2維 表格結構,帶有標籤,大小可變,且可以包含異構的資料列

DataFrame可以看做是Series的容器,即:一個DataFrame中可以包含若干個Series。

series

由於Series是一堆結構的資料,我們可以直接通過陣列來建立這種資料,像這樣:

import pandas as pd
import numpy as np
 
series1 = pd.Series([1, 2, 3, 4])
print("series1:\n{}\n".format(series1)) # series1: # 0 1 # 1 2 # 2 3 # 3 4 # dtype: int64
  • 輸出的最後一行是Series中資料的型別,這裡的資料都是int64型別的。
  • 資料在第二列輸出,第一列是資料的索引

我們分別打印出Series中的資料和索引

print("series1.values: {}\n".format(series1.values))
 
print("series1.index: {}\n".format(series1.index))

# series1.values: [1 2 3 4] # series1.index: RangeIndex(start=0, stop=4, step=1)

我們可以指定索引的型別,例如字串

series2 = pd.Series([1, 2, 3, 4, 5, 6, 7],
index=["C", "D", "E", "F", "G", "A", "B"])
print("series2:\n{}\n".format(series2))
print("E is {}\n".format(series2["E"]))

# series2:
# C    1
# D    2
# E 3 # F 4 # G 5 # A 6 # B 7 # dtype: int64 # E is 3

DataFrame

通過Numpy介面來建立一個4x4的矩陣,以此來建立DataFrame

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df1 = pd.DataFrame(np.arange(16).reshape(4,4))
 5 print("df1:\n{}\n".format(df1))
 6 
 7 # df1:
 8 #     0   1   2   3
 9 # 0   0   1   2   3
10 # 1   4   5   6   7
11 # 2   8   9  10  11
12 # 3  12  13  14  15
View Code

預設的索引和列名都是[0,N-1]的形式,同樣我們可以指定列名和索引,

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df2 = pd.DataFrame(np.arange(16).reshape(4,4),
 5 columns=["column1", "column2", "column3", "column4"],
 6 index=["a", "b", "c", "d"])
 7 print("df2:\n{}\n".format(df2))
 8 
 9 # df2:
10 #    column1  column2  column3  column4
11 # a        0        1        2        3
12 # b        4        5        6        7
13 # c        8        9       10       11
14 # d       12       13       14       15
View Code

我們也可以指定結構來建立DataFrame

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df3 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"],
 5     "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]})
 6 print("df3:\n{}\n".format(df3))
 7 
 8 # df3:
 9 #   note weekday
10 # 0    C     Mon
11 # 1    D     Tue
12 # 2    E     Wed
13 # 3    F     Thu
14 # 4    G     Fri
15 # 5    A     Sat
16 # 6    B     Sun
View Code

注意:

  • DataFrame的不同列可以是不同的資料型別

  • 如果以Series陣列來建立DataFrame,每個Series將成為一行,而不是一列

 1 import pandas as pd
 2 import numpy as np
 3  
 4 noteSeries = pd.Series(["C", "D", "E", "F", "G", "A", "B"],
 5     index=[1, 2, 3, 4, 5, 6, 7])
 6 weekdaySeries = pd.Series(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
 7     index=[1, 2, 3, 4, 5, 6, 7])
 8 df4 = pd.DataFrame([noteSeries, weekdaySeries])
 9 print("df4:\n{}\n".format(df4))
10 
11 # df4:
12 #      1    2    3    4    5    6    7
13 # 0    C    D    E    F    G    A    B
14 # 1  Mon  Tue  Wed  Thu  Fri  Sat  Sun
View Code

我們還可以“新增”或“刪除”列資料

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df3 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"],
 5                     "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]})
 6 df3["No."] = pd.Series([1, 2, 3, 4, 5, 6, 7])
 7 print("df3:\n{}\n".format(df3))
 8  
 9 del df3["weekday"]
10 print("df3:\n{}\n".format(df3))
11 
12 # df3:
13 #   note weekday  No.
14 # 0    C     Mon    1
15 # 1    D     Tue    2
16 # 2    E     Wed    3
17 # 3    F     Thu    4
18 # 4    G     Fri    5
19 # 5    A     Sat    6
20 # 6    B     Sun    7
21 
22 # df3:
23 #   note  No.
24 # 0    C    1
25 # 1    D    2
26 # 2    E    3
27 # 3    F    4
28 # 4    G    5
29 # 5    A    6
30 # 6    B    7
View Code

index物件與資料訪問

同樣可以通過索引來獲取DataFrame的行和列

1 print("df3.columns\n{}\n".format(df3.columns))
2 print("df3.index\n{}\n".format(df3.index))
3 
4 # df3.columns
5 # Index(['note', 'No.'], dtype='object')
6 
7 # df3.index
8 # RangeIndex(start=0, stop=7, step=1)
View Code

注意:

  • Index並非集合,因此其中可以包含重複的資料

  • Index物件的值是不可以改變,因此可以通過它安全的訪問資料

DataFrane提供了下面兩個操作符來訪問其中的資料

  • loc:通過行和列的索引來訪問資料

  • iloc:通過行和列的下標來訪問資料

 1 print("Note C, D is:\n{}\n".format(df3.loc[[0, 1], "note"]))
 2 print("Note C, D is:\n{}\n".format(df3.iloc[[0, 1], 0]))
 3 
 4 # Note C, D is:
 5 # 0    C
 6 # 1    D
 7 # Name: note, dtype: object
 8 
 9 # Note C, D is:
10 # 0    C
11 # 1    D
12 # Name: note, dtype: object
View Code

第一行程式碼訪問了行索引為0和1,列索引為“note”的元素,第二行程式碼訪問了行下標為0和1對於df3來說,行索引和行下標剛好是一樣的,所以這裡都是0和1,但它們卻是不同的含義),列下標為0的元素。

檔案操作

讀取Excel檔案

注:要讀取Excel檔案,還需要安裝另外一個庫;xlrd

pip install xlrd

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df1 = pd.read_excel("data/test.xlsx")
 5 print("df1:\n{}\n".format(df1))
 6 
 7 # df1:
 8 #    C  Mon
 9 # 0  D  Tue
10 # 1  E  Wed
11 # 2  F  Thu
12 # 3  G  Fri
13 # 4  A  Sat
14 # 5  B  Sun
View Code

 讀取csv檔案

1 C,Mon
2 D,Tue
3 E,Wed
4 F,Thu
5 G,Fri
6 A,Sat
第一個CSV檔案內容
1 C|Mon
2 D|Tue
3 E|Wed
4 F|Thu
5 G|Fri
6 A|Sat
第二個CSV檔案的內容

讀取CSV檔案

1 import pandas as pd
2 import numpy as np
3 df2 = pd.read_csv("data/test1.csv")
4 print("df2:\n{}\n".format(df2))
5 # df3 = pd.read_csv("data/test2.csv", sep="|")
6 # print("df3:\n{}\n".format(df3))
View Code

我們可以發現,第二個CSV檔案並不是通過逗號分隔的,我們通常指定分隔符的方式來讀取這個檔案。

read_csv支援非常多的引數用來調整讀取的引數

引數說明
path 檔案路徑
sep或者delimiter 欄位分隔符
header 列名的行數,預設是0(第一行)
index_col 列號或名稱用作結果中的行索引
names 結果的列名稱列表
skiprows 從起始位置跳過的行數
na_values 代替NA的值序列
comment 以行結尾分隔註釋的字元
parse_dates 嘗試將資料解析為datetime。預設為False
keep_date_col 如果將列連線到解析日期,保留連線的列。預設為False
converters 列的轉換器
dayfirst 當解析可以造成歧義的日期時,以內部形式儲存。預設為False
data_parser 用來解析日期的函式
nrows 從檔案開始讀取的行數
iterator 返回一個TextParser物件,用於讀取部分內容
chunksize 指定讀取塊的大小
skip_footer 檔案末尾需要忽略的行數
verbose 輸出各種解析輸出的資訊
encoding 檔案編碼
squeeze 如果解析的資料只包含一列,則返回一個Series
thousands 千數量的分隔符

處理無效值

主要有兩種處理方法:直接忽略這些無效值;或者將無效值替換成有效值。

我們先建立一個包含無效值的資料結構。然後通過pandas.isna函式來確認哪些值是無效的:

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
 5                   [5.0, np.nan, np.nan, 8.0],
 6                   [9.0, np.nan, np.nan, 12.0],
 7                   [13.0, np.nan, 15.0, 16.0]])
 8  
 9 print("df:\n{}\n".format(df));
10 print("df:\n{}\n".format(pd.isna(df)))
11 
12 # df:
13 #       0   1     2     3
14 # 0   1.0 NaN   3.0   4.0
15 # 1   5.0 NaN   NaN   8.0
16 # 2   9.0 NaN   NaN  12.0
17 # 3  13.0 NaN  15.0  16.0
18  
19 # df:
20 #        0     1      2      3
21 # 0  False  True  False  False
22 # 1  False  True   True  False
23 # 2  False  True   True  False
24 # 3  False  True  False  False
View Code

忽略無效值

我們可以通過pandas.DataFrame.dropna函式拋棄無效值

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
 5                   [5.0, np.nan, np.nan, 8.0],
 6                   [9.0, np.nan, np.nan, 12.0],
 7                   [13.0, np.nan, 15.0, 16.0]])
 8  
 9 print("df.dropna():\n{}\n".format(df.dropna()));
10 
11 # df.dropna():
12 # Empty DataFrame
13 # Columns: [0, 1, 2, 3]
14 # Index: []
View Code

對於原先的結構,當無效值全部被拋棄之後,將不再是一個有效的DataFrame,所以才會是以上結果

我們也可以選擇拋棄整列都是無效值的那一列:

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
 5                   [5.0, np.nan, np.nan, 8.0],
 6                   [9.0, np.nan, np.nan, 12.0],
 7                   [13.0, np.nan, 15.0, 16.0]])
 8  
 9 print("df.dropna(axis=1,how='all'):\n{}\n".format(df.dropna(axis=1, how='all')));
10 
11 # df.dropna(axis=1, how='all'):
12 #       0     2     3
13 # 0   1.0   3.0   4.0
14 # 1   5.0   NaN   8.0
15 # 2   9.0   NaN  12.0
16 # 3  13.0  15.0  16.0
View Code

注:axis=1表示列的軸。how可以取值’any’或者’all’,預設是前者。

替換無效值

我們也可以通過fillna函式將無效值替換成為有效值

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
 5                   [5.0, np.nan, np.nan, 8.0],
 6                   [9.0, np.nan, np.nan, 12.0],
 7                   [13.0, np.nan, 15.0, 16.0]])
 8  
 9 print("df:\n{}\n".format(df));
10 
11 print("df.fillna(1):\n{}\n".format(df.fillna(1)));
12 
13 # df:
14 #       0   1     2     3
15 # 0   1.0 NaN   3.0   4.0
16 # 1   5.0 NaN   NaN   8.0
17 # 2   9.0 NaN   NaN  12.0
18 # 3  13.0 NaN  15.0  16.0
19 
20 # df.fillna(1):
21 #       0    1     2     3
22 # 0   1.0  1.0   3.0   4.0
23 # 1   5.0  1.0   1.0   8.0
24 # 2   9.0  1.0   1.0  12.0
25 # 3  13.0  1.0  15.0  16.0
View Code

將無效值全部替換成同樣的資料可能意義不大,因此我們可以指定不同的資料來進行填充。為了便於操作,在填充之前,我們可以先通過rename方法修改行和列的名稱:

 1 import pandas as pd
 2 import numpy as np
 3  
 4 df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
 5                   [5.0, np.nan, np.nan, 8.0],
 6                   [9.0, np.nan, np.nan, 12.0],
 7                   [13.0, np.nan, 15.0, 16.0]])
 8  
 9 print("df:\n{}\n".format(df));
10 print("df:\n{}\n".format(pd.isna(df)))
11 
12 df.rename(index={0: 'index1', 1: 'index2', 2: 'index3', 3: 'index4'},
13           columns={0: 'col1', 1: 'col2', 2: 'col3', 3: 'col4'},
14           inplace=True);
15 df.fillna(value={'col2': 2}, inplace=True)  # 把第2列的空值變成2
16 df.fillna(value={'col3': 7}, inplace=True)  # 把第3列的空值變成7
17 print("df:\n{}\n".format(df));
18 
19 # df:
20 #       0   1     2     3
21 # 0   1.0 NaN   3.0   4.0
22 # 1   5.0 NaN   NaN   8.0
23 # 2   9.0 NaN   NaN  12.0
24 # 3  13.0 NaN  15.0  16.0
25 
26 # df:
27 #        0     1      2      3
28 # 0  False  True  False  False
29 # 1  False  True   True  False
30 # 2  False  True   True  False
31 # 3  False  True  False  False
32 
33 # df:
34 #         col1  col2  col3  col4
35 # index1   1.0   2.0   3.0   4.0
36 # index2   5.0   2.0   7.0   8.0
37 # index3   9.0   2.0   7.0  12.0
38 # index4  13.0   2.0  15.0  16.0
View Code

處理字串

Seriesstr欄位包含了一系列的函式用來處理字串。並且,這些函式會自動處理無效值。

 1 import pandas as pd
 2  
 3 s1 = pd.Series([' 1', '2 ', ' 3 ', '4', '5']);
 4 print("s1.str.rstrip():\n{}\n".format(s1.str.lstrip()))
 5 print("s1.str.strip():\n{}\n".format(s1.str.strip()))
 6 print("s1.str.isdigit():\n{}\n".format(s1.str.isdigit()))
 7 
 8 # s1.str.rstrip():
 9 # 0     1
10 #
            
           

相關推薦

Python 資料處理 pandas 入門教程

Python 資料處理庫 pandas 入門教程2018/04/17 · 工具與框架 · Pandas, Python 原文出處: 強波的技術部落格 pandas是一個Python語言的軟體包,在我們使用Python語言進行機器學習程式設計的時候,這是一個非常常用的基礎程式設計庫。本文是對它的一個入門教程。p

Python資料處理pandas基本使用

---恢復內容開始---   pandas提供過便於操作資料的資料型別,也提供了許多分析函式和分析工具,使得資料分析易於操作。   一、pandas庫中Series型別   Series可以生成資料的索引(自動索引和自定義索引),見下例:      Se

Python資料處理pandas入門教程

       pandas是一個Python的yuyi語言軟體包,在我們使用Python語音進行機器學習程式設計的時候,這是一個非常常用的基礎程式設計庫。本文是對它的一個入門教程。 pandas提供了快速,靈活和富有表現力的資料結構,目的是使“關係”或“標記”資料的工作既簡

Python資料處理pandas進階教程

在前面一篇文章中,我們對pandas做了一些入門介紹。本文是它的進階篇。在這篇文章中,我們會講解一些更深入的知識。 前言 本文緊接著前一篇的入門教程,會介紹一些關於pandas的進階知識。建議讀者在閱讀本文之前先看完pandas入門教程。 資料訪問 在入門教程中,

Python 資料處理 pandas

核心資料結構 pandas最核心的就是Series和DataFrame兩個資料結構。 名稱維度說明 Series 1維 帶有標籤的同構型別陣列

python資料處理numpy、pandas陣列操作

1.numpy 1.1陣列行列 import numpy as np data_np=np.array(data) data_col=data_np[:,2:] data_row=data_np[] 1.2陣列拼接 按列拼接 data_cat_

python資料處理pandas多表操作

pandas多表操作 1.Inner Merge 合併dataframe  pd.merge()將兩張dataframe合成一張 除了pandas的方法,each DataFrame都有自己的merge()方法 查詢 類似於SELECT WHERE res

python資料處理pandas行列操作及聚合

1.列操作 apply  df.coulumn.function()  (df.count.mean()這種) 例子: 將Name列全部大寫  from string import upper df['Name'] = df.Name.a

python資料處理pandas基礎操作

基礎操作 1.建立表 dataframe 類似於csv 與SQL表  方法1 import codecademylib import pandas as pd df1 = pd.DataFrame({ 'Product ID': [1, 2

Python資料處理(二) | Pandas資料處理

本篇部落格所有示例使用Jupyter NoteBook演示。 Python資料處理系列筆記基於:Python資料科學手冊電子版  下載密碼:ovnh 示例程式碼  下載密碼:02f4 目錄

Python資料分析pandas基本操作

pandas是什麼? 是它嗎? 。。。。很顯然pandas沒有這個傢伙那麼可愛。。。。 我們來看看pandas的官網是怎麼來定義自己的: pandas is an open source, easy-to-use data structures and data an

Python資料處理Pandas模組的 12 種實用技巧

簡介 Python 正迅速成為資料科學家們更為鍾愛的程式語言。形成該現狀的理由非常充分:Python 提供了一種覆蓋範圍更為廣闊的程式語言生態系統,以及具有一定計算深度且效能良好的科學計算庫。如果您是 Python 初學者,建議首先看下Python 學習路線。 在 Python

python資料處理工具 pandas包常用方法總結(持續更新)

======================== INTRODUCTION TO PANDAS  ======================== 圓括號是函式,方括號是索引 #Series data  can be numpy array,or a python dict

python 資料處理學習pandas之DataFrame(三)

請原諒沒有一次寫完,本文是自己學習過程中的記錄,完善pandas的學習知識,對於現有網上資料的缺少和利用python進行資料分析這本書部分知識的過時,只好以記錄的形勢來寫這篇文章.最如果後續工作定下來有時間一定完善pandas庫的學習,請見諒!               

python資料分析處理-Pandas資料讀取、索引與計算

Pandas資料讀取、索引與計算 Pandas資料結構為DataFrame,裡面可以同時是int、float、object(string型別時)、datatime、bool資料型別 import p

python資料分析處理-Pandas之Series結構及Series常用操作方法

我上上篇部落格說過:Pandas資料結構為DataFrame,裡面可以同時是int、float、object(string型別時)、datatime、bool資料型別。而構成DataFrame結構的每一

python常用資料處理的安裝(numpy pandas matplotlib)

這篇文章記錄的不錯,轉載一把https://www.cnblogs.com/lxmhhy/p/6029465.htmlpip install matplotlib -i http://pypi.douban.com/simple --trusted-host pypi.dou

【A-003】python資料分析與機器學習實戰 Python科學計算 Pandas資料分析處理(四)DataFrame資料結構

pandas資料結構:DataFrame 引入: 在上一節中已經介紹過了Series物件,Series物件可以理解為由一列索引和一列值,共兩列資料組成的結構。而DataFrame就是由一列索引和多列值組成的結構,其中,在DataFrame中的每一列都是一個S

Python資料處理PySpark實戰

https://cloud.tencent.com/developer/article/1096712 Spark的安裝和使用(Python版) http://dblab.xmu.edu.cn/blog/1689-2/ https://blog.csdn.net/qq_14959801/

Python資料處理之(一)為什麼要學習 Numpy & Pandas

今天我們介紹兩個科學運算當中最為重要的兩個模組,一個是numpy,一個是 pandas。任何關於資料分析的模組都少不了它們兩個。 一、主要用途: 資料分析 機器學習 深度學習 二、為什麼使用 numpy & pandas