問題:
利用pandas讀入數據時,經常是通過pd.read_excel(r'path.xlsx')但有時,可能只需要表格中的某些列,當讀入整張表格后,再通過索引選取需要的列,例如某個數據處理過程可能只需要['班級', '姓名', '語文']這三列數據。
按以前的習慣代碼可能就寫成如下:
import pandas as pd
df = pd.read_excel(r'成績.xlsx')
new_df = df[['班級', '姓名', '語文']]
其實可以通過設置pd.read_excel()的參數直接實現,這樣如果數據量很大時,還可以省下很多內存。(可通過sys模塊中getsizeof(o)查看對象所占內存)
import pandas as pd
df = pd.read_excel(r'成績.xlsx', usecols=range(3))
在處理數據時,了解其自身參數,並充分利用,可以帶來一些好處,比如節省內存等等,那下面的介紹將從3個方面去介紹:
- 如何設置參數選取特定列
- 如何設置參數選取特定行
- 關於數據轉換的一些參數
1.usecols的取值可以是哪些類型?
usecols值可以為:(None, str , list, callable)
None:默認值,返回所有列
str:‘A:C' 或者 ’A,B,C' ,excel中所選取的列所對應的字母
df = pd.read_excel(r'成績.xlsx', usecols='A:C'**)
list:可以為列數的集合或者列名的集合
df = pd.read_excel(r'成績.xlsx', usecols=[0,1,2]**)
df = pd.read_excel(r'成績.xlsx', usecols=['班級', '姓名', '語文']**)
callable:函數,返回列名符合某些條件的那些列,比如返回**列名**中包含語文和數學的那些列
df = pd.read_excel(r'成績.xlsx', usecols=lambda x: x in ['班級', '姓名', '語文']) # 有點類似apply的意思
備注:0.24版本之前,int:表示選取前**int+1**列,0.24之后被舍棄了,可以用[0,1,2,..,int]或者range(0, int+1)
2. 了解完了選取某些列之外,那關於如何選取某些行的參數有3個:
nrows: int,表示選取前n行
df = pd.read_excel(r'成績.xlsx', nrows=1)
skipfooter:int,表示從最后一行開始,不讀取n行
df = pd.read_excel(r'成績.xlsx', skipfooter=2) # 表示
skiprows: list-like,表示不讀取某些行
df = pd.read_excel(r'成績.xlsx', skiprows=range(1, 100, 2)) # 只讀取偶數行
3.除了以上關於行或列的操作,還有一些數據轉換的參數:
dtype: 轉換某些列的數據類型
type_name: 設置所有的列為type_name,若出現不能轉換的類型,會報錯;
df = pd.read_excel(r'成績.xlsx', dtype=int) # 會報錯,因為不能將字符串轉換成int
字典:{col _ name: type _ name,...}
df = pd.read_excel(r'成績.xlsx', dtype={'班級': str, '數學': float})
convert_float:是否將float類型的整型(20.00)轉換成int類型(20),默認值為True
備注:若某列數字包含真正的浮點數比如(20.01),那么該列將不會被轉換(參考下圖)
df = pd.read_excel(r'成績.xlsx', convert_float=True)
df = pd.read_excel(r'成績.xlsx', convert_float=False)
parse_dates與date_parser:通過設置parse_dates參數,可以在數據讀入的時候將字符串格式的數據轉換成日期格式;而date_parser參數則是進行日期轉換的引擎(或者叫函數)
parse_dates:
布爾值:值為True,解析index列
列表:列名或者列數--['col_name','col_name',..] or ['col_num1, col_num2,...] ,同時將多列字符串格式轉換成日期格式
列表:列表的列表 ---[['col_name','col_name2']] or [['col_num','col_num2']],將列表中的多列,合並一個日期格式
字典:{'str': ['col_name','col_name2',..]} 為新合並的日期列指定一個新的列名'col_name'
date_parser:function,默認調用dateutil.parser.parser 進行解析日期,具體解析哪些列取決於parse_dates指定的參數。因為此值可以為函數,所以可以進行自定義。
例如:如下格式的日期,利用data_parser的默認值並不能進行成功轉換,所以可以date_parser 結合 pd.to_datetime()進行定義函數可以進行轉換
df = pd.read_excel(r'日期.xlsx', parse_dates=['date'], date_parser=lambda x: pd.to_datetime(x, format='%Y%m')
converters: 當然了,上述日期轉換也可以通過設置converters也可以實現:converters意思就是將某個函數應用到某列上。
df = pd.read_excel(r'日期.xlsx', sheet_name='Sheet1', converters={'date': lambda x: pd.to_datetime(x, format='%Y%m')})
至此,本篇文章涉及到了以下幾個方面:
- 如何選取某些特定的列,其所用到的參數為:usecols
- 如何選取某些特定的行,其所用到的參數為: skipfooter, skiprows, nrows
- 數據格式的設定:dtype 與 convert_float
- 日期格式的轉換: parse_dates 與 date_parser
- 某些特定列的各種轉換:converters(包括日期,數據類型等)
關於pd.read_excel()其他的參數您可以參考:
如果您有任何問題,歡迎與我進行交流!