Pandas學習記錄
Pandas是
Python
語言中非常好用的一種數據結構包,包含了許多有用的數據操作方法。而且很多算法相關的庫函數的輸入數據結構都要求是pandas
數據,或者有該數據的接口。
讀寫數據
仔細看pandas的API說明文檔,就會發現pandas
支持很多格式的文件讀寫:
Format Type | Data Description | Reader | Writer |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | JSON | read_json | to_json |
text | HTML | read_html | to_html |
text | Local clipboard | read_clipboard | to_clipboard |
binary | MS Excel | read_excel | to_excel |
binary | HDF5 Format | read_hdf | to_hdf |
binary | Feather Format | read_feather | to_feather |
binary | Parquet Format | read_parquet | to_parquet |
binary | Msgpack | read_msgpack | to_msgpack |
binary | Stata | read_stata | to_stata |
binary | SAS | read_sas | |
binary | Python Pickle Format | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
SQL | Google Big Query | read_gbq | to_gbq |
- read_csv
對最常用的read_csv函數的參數進行詳解
函數說明:讀取CSV(默認逗號分割)文件到DataFrame
-
基礎參數
filepath_or_buffer: str,pathlib.
任何可用read()的基類都可以,也可以是URL
sep : str, default ‘,’
指定分隔符。如果不指定參數,則會嘗試使用逗號分隔。分隔符長於一個字符並且不是‘\s+’,將使用python的語法分析器。並且忽略數據中的逗號。正則表達式例子:’\r\t’
delimiter : str, default None
定界符,備選分隔符(如果指定該參數,則sep參數失效)
delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作爲分隔符使用,等效於設定sep=’\s+’。如果這個參數設定爲Ture那麼delimiter 參數失效。 -
列/行索引及其名字
header : int or list of ints, default ‘infer’
指定行數用來作爲列名,數據開始行數。如果文件中沒有列名,則默認爲0,否則設置爲None。如果明確設定header=0 就會替換掉原來存在列名。
header參數可以是一個list例如:[0,1,3],這個list表示將文件中的這些行作爲列標題(意味着每一列有多個標題),介於中間的行將被忽略掉(例如本例中的2;本例中的數據1,2,4行將被作爲多級標題出現,第3行數據將被丟棄,dataframe的數據從第5行開始。)。
names : array-like, default None
用於結果的列名列表,如果數據文件中沒有列標題行,就需要執行header=None。默認列表中不能出現重複,除非設定參數mangle_dupe_cols=True。
nrows : int, default None
需要讀取的行數(從文件頭開始算起)。
index_col : int or sequence or False, default None
用作行索引的列編號或者列名,如果給定一個序列則有多個行索引。
如果文件不規則,行尾有分隔符,則可以設定index_col=False 來是的pandas不適用第一列作爲行索引。
prefix : str, default None
在沒有列標題時,給列添加前綴。例如:添加‘X’ 成爲 X0, X1, …
mangle_dupe_cols : boolean, default True
重複的列,將‘X’…’X’表示爲‘X.0’…’X.N’。如果設定爲false則會將所有重名列覆蓋。 -
解釋器基本配置
dtype : Type name or dict of column -> type, default None
每列數據的數據類型。例如 {‘a’: np.float64, ‘b’: np.int32}
engine : {‘c’, ‘python’}, optional
使用的分析引擎。可以選擇C或者是python。C引擎快但是Python引擎功能更加完備。
converters : dict, default None
列轉換函數的字典。key可以是列名或者列的序號。
iterator : boolean, default False
返回一個TextFileReader 對象,以便逐塊處理文件。
compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盤上的壓縮文件。如果使用infer參數,則使用 gzip, bz2, zip或者解壓文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’這些爲後綴的文件,否則不解壓。如果使用zip,那麼ZIP包中必須只包含一個文件。設置爲None則不解壓。
decimal : str, default ‘.’`
字符中的小數點 (例如:歐洲數據使用’,‘). -
忽略及空缺值
skipinitialspace : boolean, default False
忽略分隔符後的空白(默認爲False,即不忽略).
skiprows : list-like or integer, default None
需要忽略的行數(從文件開始處算起),或需要跳過的行號列表(從0開始)。
na_values : scalar, str, list-like, or dict, default None
一組用於替換NA/NaN的值。如果傳參,需要制定特定列的空值。默認爲‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’.
keep_default_na : bool, default True如果指定na_values參數,並且keep_default_na=False,那麼默認的NaN將被覆蓋,否則添加。
na_filter : boolean, default True是否檢查丟失值(空字符串或者是空值)。對於大文件來說數據集中沒有空值,設定na_filter=False可以提升讀取速度。
kip_blank_lines : boolean, default True `
如果爲True,則跳過空行;否則記爲NaN。 -
其他(引號、編碼)
quotechar : str (length 1), optional
引號,用作標識開始和解釋的字符,引號內的分割符將被忽略。
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引號常量。可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote : boolean, default True
雙引號,當單引號已經被定義,並且quoting 參數不是QUOTE_NONE的時候,使用雙引號表示引號內的元素作爲一個元素使用。
escapechar : str (length 1), default None
當quoting 爲QUOTE_NONE時,指定一個字符使的不受分隔符限值。
encoding : str, default None
指定字符集類型,通常指定爲’utf-8’. List of Python standard encodings
下使用)。
數據結構
Dimensions | Name | Description |
---|---|---|
1 | Series | 1D labeled |
2 | DataFrame | General 2D labeled |
DataFrame
創建
- 通過字典創建
In [10]: df2 = pd.DataFrame({ 'A' : 1.,
....: 'B' : pd.Timestamp('20130102'),
....: 'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
....: 'D' : np.array([3] * 4,dtype='int32'),
....: 'E' : pd.Categorical(["test","train","test","train"]),
....: 'F' : 'foo' })
....:
In [11]: df2
Out[11]:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
- 通過numpy,並指定列明,索引名創建
In [6]: dates = pd.date_range('20130101', periods=6)
In [7]: dates
Out[7]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
In [8]: df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
In [9]: df
Out[9]:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
查看數據及其相關屬性
df.head(num)
: 前num行
df.tail(num)
: 倒數num行
df.index
: 索引名
df.columns
: 列名
df.values
: 數據值
內置操作
- 轉置:
df.T
- 排序:
- 按索引排序
df.sort_index(axis=1, ascending=False)
- 按列數據排序
df.sort_values(by='B')
- 按索引排序
選擇篩選
- 通過行索引/列名:
df['A']
、df[0:3]
、df['20130102':'20130104']
- 通過label選擇:
df.loc
df.loc[:,['A','B']]
df.loc['20130102':'20130104',['A','B']]
df.loc[dates[0],'A']
=df.at[dates[0],'A']
- 通過定位選擇:
df.iloc
df.iloc[3]
df.iloc[3:5,0:2]
df.iloc[[1,2,4],[0,2]]
df.iloc[1,1]
=df.iat[1,1]
- 通過布爾值選擇
df[df.A > 0]
A列中大於0的所有行df[df > 0]
df中所有<=0的置爲空缺值df2[df2['E'].isin(['two','four'])]
In [43]: df2 Out[43]: A B C D E 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 one 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 one 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 three 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 three In [44]: df2[df2['E'].isin(['two','four'])] Out[44]: A B C D E 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four
修改值
df['F'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df.at[dates[0],'A'] = 0
df.loc[:,'D'] = np.array([5] * len(df))
data = data.loc[:,cols]
交換列順序
DataFrame合併
- Concat
- Join
- Append
apply函數
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
func:
函數指針,可以是lamda函數,自己實現
axis:
指定函數的傳入參數,若axis = 1
,就會把每一行數據作爲Series進行傳入
args:
func函數的參數
import pandas as pd
import datetime #用來計算日期差的包
def dataInterval(data1,data2):
d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
delta = d1 - d2
return delta.days
def getInterval_new(arrLike,before,after): #用來計算日期間隔天數的調用的函數
before = arrLike[before]
after = arrLike[after]
days = dataInterval(after.strip(),before.strip()) #注意去掉兩端空白
return days
if __name__ == '__main__':
fileName = "NS_new.xls";
df = pd.read_excel(fileName)
df['TimeInterval'] = df.apply(getInterval_new ,
axis = 1, args = ('ReceivedTime','PublishedTime')) #調用方式一
#下面的調用方式等價於上面的調用方式
df['TimeInterval'] = df.apply(getInterval_new ,
axis = 1, **{'before':'ReceivedTime','after':'PublishedTime'}) #調用方式二
#下面的調用方式等價於上面的調用方式
df['TimeInterval'] = df.apply(getInterval_new ,
axis = 1, before='ReceivedTime',after='PublishedTime') #調用方式三