pandas速成筆記(2)-excel增刪改查基本操作


上篇繼續,本篇演示對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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM