接上篇繼續,本篇演示對excel的基本增刪改查操作。
一、讀取excel
1.1 常規讀取
假設有以下excel文件: 002.xlsx

用pandas可以這樣讀取:
import pandas as pd
df = pd.read_excel("data/002.xlsx")
print(df.shape)
print(df.columns)
print(df)
顯示如下:
(6, 2) Index(['id', 'name'], dtype='object') id name 0 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 6 F
解釋:
第1行輸出(6,2),表示這是6行2列
第2行輸出的是列信息,表示有id, name這2列,都是object類型
第3行輸出的就是表格數據,注意最左沒有列名的這列,從0到5,如果做過數據庫開發的同學,應該都知道:數據表內部通常會有一個唯一鍵,也稱為主鍵索引。pandas讀取的excel,如果沒有指定索引,默認會按數字順序,生成1個默認的索引,即上面的0-5。
如果在讀取時,微調一下,指定索引列:
df = pd.read_excel("data/002.xlsx", index_col="id")
輸出就變成了下面這樣:
(6, 1) Index(['name'], dtype='object') name id 1 A 2 B 3 C 4 D 5 E 6 F
可以看到id變成了現在的索引列,但是要注意一點:pandas里的索引列,跟數據庫表中的主鍵索引,還是有不同的,它允許重復! 感興趣的同學,可以把這個excel文件的id列,找2行,改成相同的值,比如下面這樣:

還是剛才的代碼,輸出如下:
(6, 1) Index(['name'], dtype='object') name id 1 A 2 B 3 C 4 D 5 E 5 F
1.2 無標題行的excel讀取
有時候,可能拿到的excel,沒有title,只有數據,比如這樣:

import pandas as pd
df = pd.read_excel("data/002.xlsx")
print(df)
這時候,讀出來是這樣:
1 A 0 2 B 1 3 C 2 4 D 3 5 E 4 5 F
第1行數據會誤認為是title,可以加上header=None
import pandas as pd
df = pd.read_excel("data/002.xlsx", header=None)
print(df)
這樣就正常了:
0 1 0 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 5 F
1.3 左側與上邊有空行的讀取
再來看一種特殊情況:數據左邊和上邊都有空行

同樣可以加一些參數 skiprows=1 , usecols="C:D"表示跳過1行,列從C至D
import pandas as pd
df = pd.read_excel("data/002.xlsx", skiprows=1, usecols="C:D", index_col="ID")
print(df)
1.4 多Sheet的讀取
假設excel文件,有下面2個Sheet


可以通過sheet_name=xxx來指定讀取
import pandas as pd
df1 = pd.read_excel("./data/test.xlsx", sheet_name="Sheet1")
df2 = pd.read_excel("./data/test.xlsx", sheet_name="Sheet2")
print(df1)
print("----------------------")
print(df2)
輸出:
name age 0 n-1 10 1 n-2 45 2 n-3 32 3 n-4 12 4 n-5 67 5 n-6 25 ---------------------- name score 0 n-2 80 1 n-4 100 2 n-6 75
二、添加/刪除一行(或一列)
還是這個excel文件:

2.1 添加一行
import pandas as pd
df = pd.read_excel("data/002.xlsx", index_col="ID")
print(df)
print("----------")
# 添加一行
df.loc[df.size + 1] = {"ID": 7, "Name": "H"}
print(df)
輸出如下:
Name ID 1 A 2 B 3 C 4 D 5 E 6 F ---------- Name ID 1 A 2 B 3 C 4 D 5 E 6 F 7 H
2.2 添加一列
import pandas as pd
df = pd.read_excel("data/002.xlsx", index_col="ID")
print(df)
print("----------")
# 添加一列
df['Age'] = range(21, 27)
print(df)
輸出:
Name ID 1 A 2 B 3 C 4 D 5 E 6 F ---------- Name Age ID 1 A 21 2 B 22 3 C 23 4 D 24 5 E 25 6 F 26
2.3 刪除一行(或一列)
import pandas as pd
df = pd.read_excel("data/002.xlsx", index_col="ID")
print(df)
print("----------")
# 先添加一列
df['Age'] = range(21, 27)
print(df)
# 再刪除一列
df.drop("Name", axis=1, inplace=True)
print("----------")
print(df)
# 按index值,再刪除3行
df.drop([3, 4, 5], axis=0, inplace=True)
print("----------")
print(df)
輸出:
Name
ID
1 A
2 B
3 C
4 D
5 E
6 F
----------
Name Age
ID
1 A 21
2 B 22
3 C 23
4 D 24
5 E 25
6 F 26
----------
Age
ID
1 21
2 22
3 23
4 24
5 25
6 26
----------
Age
ID
1 21
2 22
6 26
三、修改指定單元格
import pandas as pd
df = pd.read_excel("data/002.xlsx", index_col="ID")
print(df)
print("----------")
# 修改ID=1這行的Name值
df.loc[1]["Name"] = "test"
print(df)
輸出:
Name
ID
1 A
2 B
3 C
4 D
5 E
6 F
----------
Name
ID
1 test
2 B
3 C
4 D
5 E
6 F
四、遍歷所有單元格
import pandas as pd
df = pd.read_excel("data/002.xlsx", index_col="ID")
print(df)
print("----------")
# 遍歷所有單元格
for idx, data in df.iterrows():
print("id:{}\tname:{}".format(idx, data["Name"]))
輸出:
Name ID 1 A 2 B 3 C 4 D 5 E 6 F ---------- id:1 name:A id:2 name:B id:3 name:C id:4 name:D id:5 name:E id:6 name:F
五、過濾數據

import pandas as pd
df = pd.read_excel("./data/test.xlsx", index_col="id")
print(df)
print("---------------")
# 過濾age>30的
df2 = df[df["age"] > 30]
print(df2)
print("---------------")
# 選[1,3)行,第[1,2)列,即:第2,3行,第2列
df2 = df.iloc[1:3, 1:2]
print(df2)
print("---------------")
# 選擇id在(1002,1005)之間的數據
df2 = df.query('1002<id<1005')
print(df2)
輸出:
name age register_date
id
1001 n-1 10 2001-01-01
1002 n-2 45 2018-02-03
1003 n-3 32 2000-10-23
1004 n-4 12 2006-03-15
1005 n-5 67 2022-03-01
1006 n-6 25 1999-08-12
---------------
name age register_date
id
1002 n-2 45 2018-02-03
1003 n-3 32 2000-10-23
1005 n-5 67 2022-03-01
---------------
age
id
1002 45
1003 32
---------------
name age register_date
id
1003 n-3 32 2000-10-23
1004 n-4 12 2006-03-15
六、保存excel
6.1 單sheet的excel寫入
假如要將test.xlsx中id在1002到1005之間(不包含二端)的記錄過濾出來,保存到另1個excel中,可以這樣寫:
import pandas as pd
pd \
.read_excel("./data/test.xlsx", index_col="id") \
.query('1002<id<1005') \
.to_excel("./data/output.xlsx")
6.2 多sheet的excel寫入
import pandas as pd
df1 = pd.DataFrame({"ID": [10, 11, 12], "Name": ["A", "B", "C"]})
df1.set_index("ID", inplace=True)
df2 = pd.DataFrame({"ID": [11, 12, 13], "Score": [90, 80, 76]})
df2.set_index("ID", inplace=True)
writer = pd.ExcelWriter(r"./data/test.xlsx")
df1.to_excel(writer, sheet_name="sheet1")
df2.to_excel(writer, sheet_name="sheet2")
writer.save()
print("done")
效果:


參考鏈接:
https://pandas.pydata.org/pandas-docs/stable/getting_started/intro_tutorials/index.html
