示例 Excel 數據
我們以下面Excel 為例,演示Python/ target=_blank class=infotextkey>Python Pandas Excel操作。
pd.read_excel的主要參數
- io: excel文檔路徑。
- sheetname : 讀取的excel指定的sheet頁,若多個則為列表。
- header :設置讀取的excel第一行是否作為列名稱。
- skiprows:省略指定行數的數據。
- skip_footer:省略從尾部數的int行數據。
- index_col:設置讀取的excel第一列是否作為行名稱。
- names:設置每列的名稱,數組形式參數。
- usecols:讀取指定的列, 也可以通過名字或索引值。
讀取Excel文件
通過指定表單名的方式來讀取,指定列的數據。
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
print(excel)
加載的Excel數據類型為DataFrame,執行上述代碼,輸出結果為:
普及一 下 DataFrame:
- DataFrame這種列表式的數據結構和Excel工作表非常類似,其設計初衷是將Series的使用場景由一維擴展到多維。DataFrame由按一定順序的多列數據組成,各列的數據類型可以有所不同(數值、字符串、布爾值)。
- Series對象的Index數組存放有每個元素的標簽,而DataFrame對象有所不同,它有兩個索引數組。第一個索引數組與行有關,它與Series的索引數組極為相似。 每個標簽與標簽所在行的所有元素相關聯。而第二個數組包含一系列標簽,每個標簽與一列數據相關聯。
- DataFrame還可以理解為一個由Series組成的字典,其中每一列的列名為字典的鍵,每一個Series作為字典的值。
使用 iloc 從DataFrame中篩選數據
iloc 語法
data.iloc[<row selection>, <column selection>]
iloc 在Pandas中是用來通過數字來選擇數據中具體的某些行和列。可以設想每一行都有一個對應的下標(0,1,2,...),通過 iloc 我們可以利用這些下標去選擇相應的行數據。同理,對于行也一樣,通過這些下標也可以選擇相應的列數據。需要注意的是0表示第一行,并不包含表頭。
選擇單行或單列
選擇數據中的第一行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第1行數據
print(excel.iloc[0])
# 執行上述代碼,輸出結果為:
時間 2020-10-12 20:49:06
產品名稱 【拍賣交易】25000萬金=362.25元
收購比例 69.01
收購金額RMB 362.25
收購金幣數量 25000
Name: 0, dtype: object
Process finished with exit code 0
選擇數據中的最后一行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第1行數據
print(excel.iloc[-1])
選擇數據中的第一列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第1行數據
print(excel.iloc[:, 0])
# 執行上述代碼,輸出結果為:
0 2020-10-12 20:49:06
1 2020-10-12 20:42:15
2 2020-10-12 22:26:30
3 2020-10-13 19:48:59
4 2020-10-12 20:55:08
5 2020-10-12 20:53:32
6 2020-10-12 20:58:14
7 2020-10-12 21:00:16
8 2020-10-12 21:57:05
9 2020-10-12 21:56:04
Name: 時間, dtype: object
Process finished with exit code 0
選擇數據中的最后一列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第1行數據
print(excel.iloc[:, -1])
行列混合選擇
選擇數據中的第 1-3 行的所有列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 數據中的第 1-3 行 所有列
print(excel.iloc[0:3])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例 收購金額RMB 收購金幣數量
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元 69.01 362.25 25000
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元 68.97 725.00 50000
2 2020-10-12 22:26:30 【拍賣交易】120000萬金=1741.2元 68.92 1741.20 120000
Process finished with exit code 0
選擇數據中的前2列的所有行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇數據中的前2列的所有行
print(excel.iloc[:, 0:2])
選擇第 0, 2, 4行 和 第 1,3 列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第 0, 2, 4行 和 第 1,3 列
print(excel.iloc[[0, 2, 4], [1, 3]])
選擇第0-3行 的 0-2列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第0-3行 的 0-2列
print(excel.iloc[0:3, 0:2])
使用iloc只選擇了單獨的一行或一列,返回的數據為 Series 類型,而如果選擇了多行數據則會返回 DataFrame 類型,若只選擇了一行,但需要要返回 DataFrame 類型,可以傳入一個單值列表,如[1],如下:
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 行選擇:數據中的第一行
print(excel.iloc[[0] ])
# 列選擇: 數據中的第二列
print(excel.iloc[:, [1] ])
使用 loc 從DataFrame中篩選數據
data.loc[<row selection>, <column selection>]
ioc 用于以下兩種場景:
- 使用 下標 查找
- 使用 條件 查找
使用 下標 查找
選擇數據中的第一行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 數據中的第一行
print(excel.loc[[1]])
選擇數據中的前兩行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 數據中的第1、第1行
print(excel.loc[[1, 2]])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例 收購金額RMB 收購金幣數量
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元 68.97 725.0 50000
2 2020-10-12 22:26:30 【拍賣交易】120000萬金=1741.2元 68.92 1741.2 120000
選擇第1到3行的 “時間”、“收購比例” 列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇第1到3行的 “時間”、“收購比例” 列
print(excel.loc[1: 3, ['時間','收購比例']])
# 執行上述代碼,輸出結果為:
時間 收購比例
1 2020-10-12 20:42:15 68.97
2 2020-10-12 22:26:30 68.92
3 2020-10-13 19:48:59 69.23
選擇第1、2行的 "時間" 到 "收購比例" 列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 數據中的第1、第1行
print(excel.loc[[1, 2], '時間':'收購比例' ])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元 68.97
2 2020-10-12 22:26:30 【拍賣交易】120000萬金=1741.2元 68.92
需要注意excel.loc[[1]] 不等價于 excel.iloc[[1]],前者是選擇 索引為1 的行,而后者是選擇第1行,DataFrame的索引可以是數字或者是字符串。
使用邏輯判斷選擇數據
選擇“收購比例”列等于69.01的 “時間”列到 “收購比例” 列的數據
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇“收購比例”列等于69.01的 “時間”列到 “收購比例” 列的數據
print(excel.loc[excel['收購比例'] == 69.01 ,'時間':'收購比例'])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元 69.01
9 2020-10-12 21:56:04 【拍賣交易】19500萬金=282.55元 69.01
同樣,如果只選擇了某一列,返回的數據是 Series 類型,若只選擇了一行,但需要要返回 DataFrame 類型,可以傳入一個單值列表,如[1]。
選擇 “產品名稱”列 的值中是以 "【拍賣交易】" 開頭的行的所有列
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇 “產品名稱”列 的值中是以 "【拍賣交易】" 開頭的行的所有列
print(excel.loc[excel['產品名稱'].str.startswith("【拍賣交易】")])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例 收購金額RMB 收購金幣數量
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元 69.01 362.25 25000
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元 68.97 725.00 50000
2 2020-10-12 22:26:30 【拍賣交易】120000萬金=1741.2元 68.92 1741.20 120000
3 2020-10-13 19:48:59 【拍賣交易】90000萬金=1300元 69.23 1300.00 90000
6 2020-10-12 20:58:14 【拍賣交易】50000萬金=726元 68.87 726.00 50000
9 2020-10-12 21:56:04 【拍賣交易】19500萬金=282.55元 69.01 282.55 19500
選擇"收購金幣數量" 等于[25000, 50000]值的行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇"收購金幣數量" 等于[25000, 50000]值的行
print(excel.loc[excel['收購金幣數量'].isin([25000, 50000])])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例 收購金額RMB 收購金幣數量
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元 69.01 362.25 25000
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元 68.97 725.00 50000
6 2020-10-12 20:58:14 【拍賣交易】50000萬金=726元 68.87 726.00 50000
選擇 收購比例 = 69.01 并且 產品名稱 是以 "【拍賣交易】"開頭的行
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇 收購比例 = 69.01 并且 產品名稱 是以 "【拍賣交易】"開頭的行
print(excel.loc[excel['產品名稱'].str.startswith("【拍賣交易】")
& (excel['收購比例'] == 69.01)])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例 收購金額RMB 收購金幣數量
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元 69.01 362.25 25000
9 2020-10-12 21:56:04 【拍賣交易】19500萬金=282.55元 69.01 282.55 19500
利用Apply的lambda函數判斷符合條件的行,如下選擇 時間 列中20點的所有數據。
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
# 選擇 時間 列中20點的所有數據
print(excel.loc[
excel['時間']
.apply(lambda x: x.split()[1].split(":")[0] == '20')
])
# 執行上述代碼,輸出結果為:
時間 產品名稱 收購比例 收購金額RMB 收購金幣數量
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元 69.01 362.25 25000
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元 68.97 725.00 50000
4 2020-10-12 20:55:08 【當面交易】8000萬金=116元 68.97 116.00 8000
5 2020-10-12 20:53:32 【郵寄交易】10000萬金=144元 69.44 144.00 10000
6 2020-10-12 20:58:14 【拍賣交易】50000萬金=726元 68.87 726.00 50000
利用apply的lambda函數判斷符合條件的行的'時間', '產品名稱' 列。
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
idx = excel['時間'].apply(lambda x: x.split()[1].split(":")[0] == '20')
# 只選擇 idx 值為True的那些行,并且只選擇'時間', '產品名稱'列
print(excel.loc[idx, ['時間', '產品名稱']])
# 執行上述代碼,輸出結果為:
時間 產品名稱
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元
4 2020-10-12 20:55:08 【當面交易】8000萬金=116元
5 2020-10-12 20:53:32 【郵寄交易】10000萬金=144元
6 2020-10-12 20:58:14 【拍賣交易】50000萬金=726元
Pandas中 apply、 applymap、 map 的區別:
- map僅是Series中的函數 ,map將函數應用于Series中的每一個元素。
- apply和applymap是僅是DataFrame 中的函數。
- apply 將函數作用于DataFrame中的每一個行或者列。
- applymap會將函數作用于DataFrame中的 每一個元素。
寫 Excel 文件
Pandas可以寫入一個或者多個工作簿,兩種方法介紹如下:
將一個DafaFrame寫入Excel
調用 to_excel() 方法即可實現,示例代碼如下:
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
idx = excel['時間'].apply(lambda x: x.split()[1].split(":")[0] == '20')
# 只選擇 idx 值為True的那些行,并且只選擇'時間', '產品名稱'列
data = excel.loc[idx, ['時間', '產品名稱']]
# 將數據寫入 新的 文件中
data.to_excel("數據爬取-篩選結果.xlsx", index=False)
多個數據寫入多個excel的工作簿
這時需要調用通過 ExcelWriter() 方法打開一個已經存在的excel表格作為writer,然后通過to_excel()方法將需要保存的數據逐個寫入excel,最后關閉writer。
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
idx = excel['時間'].apply(lambda x: x.split()[1].split(":")[0] == '20')
# 存儲sheet 與對應DataFrame數據
sheet_dict = {}
# 只選擇 idx 值為True的那些行,并且只選擇'時間', '產品名稱'列
data1 = excel.loc[idx, ['時間', '產品名稱']]
sheet_dict["sheet_name_1"] = data1
# 只選擇 idx 值為True的那些行,并且只選擇'時間', '收購比例'列
data2 = excel.loc[idx, ['時間', '收購比例']]
sheet_dict["sheet_name_2"] = data2
# 創建ExcelWriter對象
writer = pd.ExcelWriter("數據爬取-篩選結果.xlsx")
# 遍歷所有sheet以及對應 DataFrame數據
for sheet_name, data in sheet_dict.items():
# 將數據寫入對應sheet中
data.to_excel(writer, sheet_name=sheet_name,index=False)
# 如果省略該語句,則數據不會寫入到上邊創建的excel文件中
writer.save()
此外,我們也需要知道如何創建DataFrame數據的方式,如下:
由 列表 創建 DataFrame
import pandas as pd
test_list = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 創建DataFrame,并指定列名,不指定默認索引值
d1 = pd.DataFrame(test_list,columns=["學號","年齡","班級"])
print(d1)
# 將數據寫入 新的 文件中
d1.to_excel("test.xlsx", index=False)
由字典創建 DataFrame
import pandas as pd
test_dict = pd.DataFrame({
'學號': [1, 2, 3, 4],
'年齡': [5, 6, 7, 8],
'班級': [9, 10, 11, 12]
})
# 創建DataFrame,通過 columns 篩選 test_dict 的數據
d1 = pd.DataFrame(test_dict, columns=["學號","年齡"])
print(d1)
# 將數據寫入 新的 文件中
d1.to_excel("數據爬取-篩選結果.xlsx", index=False)
擴展: 如何 在Pandas中遍歷 DataFrame數據的行
推薦以 Pandas 的方式迭代遍歷DataFrame的行,可以使用:
DataFrame.iterrows()
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
idx = excel['時間'].apply(lambda x: x.split()[1].split(":")[0] == '20')
# 只選擇 idx 值為True的那些行,并且只選擇'時間', '產品名稱'列
data = excel.loc[idx, ['時間', '產品名稱']]
for index, row in data.iterrows():
print(index, row["時間"], row["產品名稱"])
# 執行上述代碼,輸出結果為:
0 2020-10-12 20:49:06 【拍賣交易】25000萬金=362.25元
1 2020-10-12 20:42:15 【拍賣交易】50000萬金=725元
4 2020-10-12 20:55:08 【當面交易】8000萬金=116元
5 2020-10-12 20:53:32 【郵寄交易】10000萬金=144元
6 2020-10-12 20:58:14 【拍賣交易】50000萬金=726元
DataFrame.itertuples()
快于.iterrows(),但將索引與行項目一起返回,row[0]是索引,如果它們是無效的Python標識符,重復或以下劃線開頭,列名稱將被重命名為位置名稱。
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間","產品名稱","收購比例","收購金額RMB","收購金幣數量"])
idx = excel['時間'].apply(lambda x: x.split()[1].split(":")[0] == '20')
# 只選擇 idx 值為True的那些行,并且只選擇'時間', '產品名稱'列
data = excel.loc[idx, ['時間', '產品名稱']]
for row in data.itertuples():
print(getattr(row, "時間"),getattr(row, "產品名稱"))
# 或者通過索引方式獲取
print(row[1],row[2])
其他方式
也可以使用df.apply()遍歷行并訪問函數的多個列。
DataFrame.apply()
import pandas as pd
excel = pd.read_excel('數據爬取-金幣漲跌追蹤.xlsx',
sheet_name='金幣跌漲追蹤記錄',
usecols=["時間", "產品名稱", "收購比例", "收購金額RMB", "收購金幣數量"])
idx = excel['時間'].apply(lambda x: x.split()[1].split(":")[0] == '20')
# 只選擇 idx 值為True的那些行,并且只選擇'收購金幣數量', '收購比例'列
data = excel.loc[idx, ['收購金幣數量', '收購比例']]
# 定義一個函數
def pay_rmb(number, rate):
"""
計算 收購金幣數量/ 換算比例 = 花費rmb數量
"""
return number / rate
# 增加收購金額RMB列,并通過遍歷每一行 對該列賦值
data['收購金額RMB'] = data.apply(lambda row: pay_rmb(row['收購金幣數量'], row['收購比例']), axis=1)
print(data)
# 執行上述代碼,輸出結果為
收購金幣數量 收購比例 收購金額RMB
0 25000 69.01 362.266338
1 50000 68.97 724.952878
4 8000 68.97 115.992460
5 10000 69.44 144.009217
6 50000 68.87 726.005518