日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Python Pandas 實現 Excel 的靈活操作

 

示例 Excel 數據

我們以下面Excel 為例,演示Python/ target=_blank class=infotextkey>Python Pandas Excel操作。

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,執行上述代碼,輸出結果為:

Python Pandas 實現 Excel 的靈活操作

 

普及一 下 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

分享到:
標簽:Python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定