A. 利用python進行數據分析(9)-重采樣resample和頻率轉換
Python-for-data-重新采樣和頻率轉換
重新采樣指的是將時尺耐間序列從一個頻率轉換到另一個頻率的過程。
但是也並不是所有的采樣方式都是屬於上面的兩種
pandas中使用resample方法來實現頻率轉換,下面是resample方法的參數詳解:
將數據聚合到一個規則的低頻上,例如將時間轉換為每個月,"M"或者"BM",將數據分成一個月的時間間隔。
每個間隔是半閉合的,一個數據只能屬於一個時間間隔。時間間隔的並集必須是整個時間幀
默認情況下,左箱體邊界是包含的。00:00的值是00:00到00:05間隔內的值
產生的時間序列按照每個箱體左邊的時間戳被標記。
傳遞<span class="mark">label="right"</span>可以使用右箱體邊界標記時間序列
向loffset參數傳遞字元串或者日期偏置
在金融數據中,為每個數據桶計算4個值是常見知困物的問題:
通過<span class="girk">ohlc聚合函數</span>能夠得到四種聚合值列的DF數據
低頻搭液轉到高頻的時候會形成缺失值
ffill() :使用前面的值填充, limit 限制填充的次數
B. 利用Python進行數據分析-讀書筆記(3)
pandas專門為處理表格和混雜數據設計
import pandas as pd
from pandas import Series,DataFrame
Series 類似於一維數組+索引
data = pd.Series([1,2,3,4,5]) 生成Series數據
data.values data.index
pd.Series([1,2],index = ['a','b']) 設置索引
data['a'] 通過索引選取Series中單個或一組值
data[data%2==0] 進行類似numpy數組的運算index仍會保留
'a' in data
pd.Series(python字典) 可以通過python字典創建Series
可以通過設置index改變Series元素順序
缺失值用NaN表示
pd.isnull(data) 檢測缺失數據
pd.notnull
data1 + data2 可以根據索引自動對齊數據進行運算,類似join操作
data.name data.index.name 可賦值
index可以通過賦值方式修改
pd.DataFrame(XXX)傳入元素為等長列表或np數組組成的字典可以生成DataFrame數據,字典key值為列名
frame.head() 前五行
pd.DataFrame(XXX, columns = [xxx], index = [xxxxx]) 可能產生NaN
frame['a'] 取列名為a的一列數據 等價於 frame.a(此時a需要是合理的變數名) 可以以列表形式取多列數據 返回的Series序列索引與原DataFrame相同
frame.loc[0] 行選取
可以用一個Series/值對某列賦值,需要長度相等
對不存在的列賦值可創建新列
del frame[列名] 刪除列
通過索引方式返回數據視圖,修改此返回數據也會影響源數據,Series.()可以創建副本
嵌套字典傳給DataFrame,外層字典的鍵作為列名,內層鍵作為行索引
frame.T 轉置
frame.reindex(新索引列表) 根據新索引重排,若索引值當前不存在則NaN
列可以用columns關鍵字重新索引
obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
obj3.reindex(range(6), method='ffill') ffill實現前向值填充
reindex可以修改(行)索引和列。只傳遞一個序列時,會重新索引結果的行,列可以用columns關鍵字重新索引
Series索引
series(索引列表/數值范圍切片) 選取對應元素
C. python中利用pandas怎麼處理預設值
null/None/NaN
null經常出現在資料庫中
None是Python中的缺失值,類型是NoneType
NaN也是python中的缺失值,意思是不是一個數字,類型是float
在pandas和Numpy中會將None替換為NaN,而導入資料庫中的時候則需要把NaN替換成None
找出空值
isnull()
notnull()
添加空值
numeric容器會把None轉換為NaN
In [20]: s = pd.Series([1, 2, 3])
In [21]: s.loc[0] = None
In [22]: s
Out[22]:
0 NaN
1 2.0
2 3.0
dtype: float641234567891012345678910
object容器會儲存None
In [23]: s = pd.Series(["a", "b", "c"])
In [24]: s.loc[0] = None
In [25]: s.loc[1] = np.nan
In [26]: s
Out[26]:
0 None
1 NaN
2 c
dtype:
空值計算
arithmetic operations(數學計算)
NaN運算的結果是NaN
statistics and computational methods(統計計算)
NaN會被當成空置
GroupBy
在分組中會忽略空值
清洗空值
填充空值
fillna
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
參數
value : scalar, dict, Series, or DataFrame
method : {『backfill』, 『bfill』, 『pad』, 『ffill』, None}, default None(bfill使用後面的值填充,ffill相反)
axis : {0 or 『index』, 1 or 『columns』}
inplace : boolean, default False
limit : int, default None
downcast : dict, default is None
返回值
filled : DataFrame
Interpolation
replace
刪除空值行或列
DataFrame.dropna(axis=0, how=』any』, thresh=None, subset=None, inplace=False)
參數
axis : {0 or 『index』, 1 or 『columns』}, or tuple/list thereof
how : {『any』, 『all』}
thresh : int, default None
subset : array-like
inplace : boolean, default False
返回
dropped : DataFrame
D. python填充缺失值
對於大多數情況而言,fillna方法是最主要的函數。通過一個常數調用fillna就會將缺失值替換為那個常數值。
fillna(value)
參數:value
說明:用於填充缺失值的標量值或字典對象
#通過常數調用fillna
書寫方式:df.fillna(0) #用0替換缺失值
#通過字典調用fillna
書寫方式:df.fillna({1:0.5,3:-1})
fillna(value,inplace=True)
參數:inplace
說明:修改調用者對象而不產生副本
#總是返回被填充對象的引用
書寫方式:df.fillna(0,inplace=True)
fillna(method=ffill)
參數:method
說明:插值方式。如果函數調用時未指定其他參數的話,默認為「ffill」
對reindex有效的那些插值方法也可用於fillna:
In [23]: from numpy import nan as NA
In [21]: df=DataFrame(np.random.randn(6,3))
In [24]: df.ix[2:,1]=NA;df.ix[4:,2]=NA
In [25]: df
Out[25]:
0 1 2
0 -0.863925 1.005127 -0.529901
1 0.701671 -0.501728 -0.617387
2 -0.951060 NaN -0.263626
3 0.810230 NaN -0.277401
4 -0.403899 NaN NaN
5 -0.081091 NaN NaN
In [26]: df.fillna(method='ffill')
Out[26]:
0 1 2
0 -0.863925 1.005127 -0.529901
1 0.701671 -0.501728 -0.617387
2 -0.951060 -0.501728 -0.263626
3 0.810230 -0.501728 -0.277401
4 -0.403899 -0.501728 -0.277401
5 -0.081091 -0.501728 -0.277401
fillna(limit=2)
參數:limit
說明:(對於前向和後向填充)可以連續填充的最大數量
In [27]: df.fillna(method='ffill',limit=2)
Out[27]:
0 1 2
0 -0.863925 1.005127 -0.529901
1 0.701671 -0.501728 -0.617387
2 -0.951060 -0.501728 -0.263626
3 0.810230 -0.501728 -0.277401
4 -0.403899 NaN -0.277401
5 -0.081091 NaN -0.277401
fillna(data.mean())
只要稍微動動腦子,就可以利用fillna實現許多別的功能。比如說,可以傳入Series的平均值或中位數:
In [28]: data=Series([1,NA,3.5,NA,7])
In [29]: data.fillna(data.mean())
E. 怎麼用python進行數據
pandas是本書後續內容的首選庫。pandas可以滿足以下需求:
具備按軸自動或顯式數據對齊功能的數據結構。這可以防止許多由於數據未對齊以及來自不同數據源(索引方式不同)的數據而導致的常見錯誤。.
集成時間序列功能
既能處理時間序列數據也能處理非時間序列數據的數據結構
數學運算和簡約(比如對某個軸求和)可以根據不同的元數據(軸編號)執行
靈活處理缺失數據
合並及其他出現在常見資料庫(例如基於SQL的)中的關系型運算
1、pandas數據結構介紹
兩個數據結構:Series和DataFrame。Series是一種類似於以為NumPy數組的對象,它由一組數據(各種NumPy數據類型)和與之相關的一組數據標簽(即索引)組成的。可以用index和values分別規定索引和值。如果不規定索引,會自動創建 0 到 N-1 索引。
相關系數與協方差
有些匯總
F. python pandas 日期年份列的空白單元格如何處理
如果缺失正攜備日期知道是1991年的話,那麼可以使用前向填充隱猜:
data.fillna(method='ffill')
缺失的值會使用上一行的值來進行填舉毀充,即1991,見下圖:
G. Python pandas用法
在Python中,pandas是基於NumPy數組構建的,使數據預處理、清洗、分析工作變得更快更簡單。pandas是專門為處理表格和混雜數據設計的,而NumPy更適合處理統一的數值數組數據。
使用下面格式約定,引入pandas包:
pandas有兩個主要數據結構:Series和DataFrame。
Series是一種類似於一維數組的對象,它由 一組數據 (各種NumPy數據類型)以及一組與之相關的 數據標簽(即索引) 組成,即index和values兩部分,可以通過索引的方式選取Series中的單個或一組值。
pd.Series(list,index=[ ]) ,第二個參數是Series中數據的索引,可以省略。
Series類型索引、切片、運算的操作類似於ndarray,同樣的類似Python字典類型的操作,包括保留字in操作、使用.get()方法。
Series和ndarray之間的主要區別在於Series之間的操作會根據索引自動對齊數據。
DataFrame是一個表格型的數據類型,每列值類型可以不同,是最常用的pandas對象。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個索引)。DataFrame中的數據是以一個或多個二維塊存放的(而不是列表、字典或別的一維數據結構)。
pd.DataFrame(data,columns = [ ],index = [ ]) :columns和index為指定的列、行索引,並按照順序排列。
如果創建時指定了columns和index索引,則按照索引順序排列,並且如果傳入的列在數據中找不到,就會在結果中產生缺失值:
數據索引 :Series和DataFrame的索引是Index類型,Index對象是不可修改,可通過索引值或索引標簽獲取目標數據,也可通過索引使序列或數據框的計算、操作實現自動化對齊。索引類型index的常用方法:
重新索引 :能夠改變、重排Series和DataFrame索引,會創建一個新對象,如果某個索引值當前不存在,就引入缺失值。
df.reindex(index, columns ,fill_value, method, limit, ) :index/columns為新的行列自定義索引;fill_value為用於填充缺失位置的值;method為填充方法,ffill當前值向前填充,bfill向後填充;limit為最大填充量; 默認True,生成新的對象,False時,新舊相等不復制。
刪除指定索引 :默認返回的是一個新對象。
.drop() :能夠刪除Series和DataFrame指定行或列索引。
刪除一行或者一列時,用單引號指定索引,刪除多行時用列表指定索引。
如果刪除的是列索引,需要增加axis=1或axis='columns'作為參數。
增加inplace=True作為參數,可以就地修改對象,不會返回新的對象。
在pandas中,有多個方法可以選取和重新組合數據。對於DataFrame,表5-4進行了總結
適用於Series和DataFrame的基本統計分析函數 :傳入axis='columns'或axis=1將會按行進行運算。
.describe() :針對各列的多個統計匯總,用統計學指標快速描述數據的概要。
.sum() :計算各列數據的和
.count() :非NaN值的數量
.mean( )/.median() :計算數據的算術平均值、算術中位數
.var()/.std() :計算數據的方差、標准差
.corr()/.cov() :計算相關系數矩陣、協方差矩陣,是通過參數對計算出來的。Series的corr方法用於計算兩個Series中重疊的、非NA的、按索引對齊的值的相關系數。DataFrame的corr和cov方法將以DataFrame的形式分別返回完整的相關系數或協方差矩陣。
.corrwith() :利用DataFrame的corrwith方法,可以計算其列或行跟另一個Series或DataFrame之間的相關系數。傳入一個Series將會返回一個相關系數值Series(針對各列進行計算),傳入一個DataFrame則會計算按列名配對的相關系數。
.min()/.max() :計算數據的最小值、最大值
.diff() :計算一階差分,對時間序列很有效
.mode() :計算眾數,返回頻數最高的那(幾)個
.mean() :計算均值
.quantile() :計算分位數(0到1)
.isin() :用於判斷矢量化集合的成員資格,可用於過濾Series中或DataFrame列中數據的子集
適用於Series的基本統計分析函數,DataFrame[列名]返回的是一個Series類型。
.unique() :返回一個Series中的唯一值組成的數組。
.value_counts() :計算一個Series中各值出現的頻率。
.argmin()/.argmax() :計算數據最大值、最小值所在位置的索引位置(自動索引)
.idxmin()/.idxmax() :計算數據最大值、最小值所在位置的索引(自定義索引)
pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。下表對它們進行了總結,其中read_csv()、read_table()、to_csv()是用得最多的。
在數據分析和建模的過程中,相當多的時間要用在數據准備上:載入、清理、轉換以及重塑。
在許多數據分析工作中,缺失數據是經常發生的。對於數值數據,pandas使用浮點值NaN(np.nan)表示缺失數據,也可將缺失值表示為NA(Python內置的None值)。
替換值
.replace(old, new) :用新的數據替換老的數據,如果希望一次性替換多個值,old和new可以是列表。默認會返回一個新的對象,傳入inplace=True可以對現有對象進行就地修改。
刪除重復數據
利用函數或字典進行數據轉換
df.head():查詢數據的前五行
df.tail():查詢數據的末尾5行
pandas.cut()
pandas.qcut() 基於分位數的離散化函數。基於秩或基於樣本分位數將變數離散化為等大小桶。
pandas.date_range() 返回一個時間索引
df.apply() 沿相應軸應用函數
Series.value_counts() 返回不同數據的計數值
df.aggregate()
df.reset_index() 重新設置index,參數drop = True時會丟棄原來的索引,設置新的從0開始的索引。常與groupby()一起用
numpy.zeros()
H. pandas常用函數匯總
pandas官方文檔:http://pandas.pydata.org/pandas-docs/stable/api.html
對常用函數做了匯總,每個函數的參數可能不是全的,但是常用的,不常用的沒總結,如有問題,請不吝賜教,謝謝!
1、創建Series
通用函數:pd.Series(values,index)
1)pd.Series([1,2,3],index=[『a』,『b』,『c『])
2)pd.Series(np.array([1,2,3]),index=[『a』,『b』,『c『])
3)pd.Series({ 'a':1, 'b':2, 'c':3})
Series轉字典:Series.to_dict()
說明:Series的values參數是python中常見的一維數據類型。
2、屬性李此攔
1)Series.values --->array([1,2,3])
Series的values是array類型
2)Series.index--->index([『a』,『b』,『c『])
未指定index時,自動生成 0-(N-1)的整數索引,
指定 index時,使用指定索引。
3、Series的索引與切片
Series[0] / Series['a'] : Sereis可以位置索引或標簽索引,也可以進行切片操作
1、創建DataFrame
1) 創建DataFrame的通用函數:
df = pd.DataFrame(values,index,columns)
pd.dataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['bj','sh','sz'])
pd.dataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns=['bj','sh','sz'])
pd.dataFrame('bj':[1,4,7],'sh':[2,5,8],'sz':[3,6,9],index=['a','b','c'])
說明:創建方法與Sries類似,Series的values參數是python中常見的一維數據類型,DataFrame的values參數是python中常見的二維數據類型。
2) 通過網頁中復制數據快捷創建
import webbrowser
link = 'https://www.tiobe.com/tiobe-index/'
webbrowser.open(link)
打開界面進行復扒做制,將數據復制到粘貼板中
df = pd.read_clipboard() #從粘貼板中讀取數據
3)通過Series創建DataFrame
df = pd.DataFrame([s1,s2,s3],columns=['bj','sh','sz'])
注意:單獨的s1,s2,s3是縱向排列的的Series,但是在DataFrame中是橫向排列的。
自己總結:Series除了列印出來是Series格式外,其他時候可以直接當作list來操作。
2、屬性
1)df.columns
通過columns生成新的DataFrame
df_new = pd.DataFrame(df,columns=['x1','x2'])
哪胡 或者df_new = df[['x1','x2']]
2)df.shape 顯示行列數
3)df.head() 默認顯示前5行
4)df.tail() 默認顯示後5行
3、獲取DataFrame的列
1)獲取DataFrame某一列
df.x1或df['x1']:返回值是Series,可以理解為一個DataFrame是由多個Series組成的。
2) 獲取DataFrame某幾列
df_new = df[['x1','x2','x3']]
4、為某列賦值
1) df['x1'] = range(10)
2) df['x1'] = numpy.arange(10)
3) df['x1'] = pd.Series(np.arange(10))
說明:類似於創建Series
5、為某列對應的特定行重新賦值
df['x1'] = pd.Series([2,3],index=[0,1])
將列為x1,行索引為0和1的值改為2,3
6、獲取DadaFrame的行
for row in DataFrame.iterrows():
print(row[0],row[1])
#每個row是一個元祖,包含2個元素,row[0]是整型索引,row[1]是Series,所以從行的角度也可以看出,一個DataFrame是由多個Series組成的。
7、DataFrame的轉置
df_new = df.T
1、粘貼板的io
df = pd.read_clipboard()
df.to_clipboard()
2、csv的io
df.to_csv('xxx.csv')
df = pd.read_csv('xxx.csv')
3、json的io
df.to_json()
pd.read_json(df.to_json())
4、excel的io
df.to_excel('xx.xlsx')
df = pd.read_excel('xx.xlsx')
5、df = pd.read_sql('')
df.to_sql('')
1、iloc
sub_df = df.iloc[10:20,:] 選取DataFrame的10-20行,所有列數據
sub_df = df.iloc[10:20,0:2]
說明:iloc函數是位置索引,與索引的名字無關。
2、loc
sub_df = df.loc[10:20,:'movie_name']
說明:loc是標簽索引,10,20,'movie_name' 都是索引名字,與位置無關。
1、Series.reindex(index=['x1','x2','x3'],fill_value=10)
將df重新索引,並且將NaN空值用10進行填充
2、Series.reindex(index=range(15),method='ffill')
前項填充,後面的值用前面的值進行填充
通過reindex想到,如果想新增一個空列或者空行,可以用reindex方法,同樣地,想減少某些行或者某些列,也可以用reindex方法。
繼reindex之後刪除行列的函數操作
Series.drop('A') #刪除'A'所對應的值
DataFrame.drop(label,axis)
label可以是行名也可以是列名,label是行的話axis是0,label是列的話axis是1。
** 刪除行還可以用 del df['A']
nan是numpy的一種數據類型,np.nan,float類型
任何數據與nan的運算結果都是nan
1、nan in Series
Series.isnull() -->返回value為True或者False的Series
Series.notnull() -->返回value為True或者False的Series
Series.dropna() -->返回刪除nan值後的Series
Series.fillna(method='ffill') -->前項插值,按照前面的值填充後面的空值
2、nan in DataFrame
df.isnull() -->返回value為True或者False的DataFrame
df.notnull() -->返回value為True或者False的DataFrame
df.dropna(axis=0/1,how='any/all',thresh=None)
說明:axis表示刪除行為nan或者列為nan;
any表示只要有一個為空,all表示行中的每個元素或者列中的每個元素為空;
thresh是閾值的意思,表示某行或者某列nan的個數達到閾值的個數時才刪除該行或該列。
df.fillna(value=1) --->所有的空值都填充為1
df.fillna(value={0:0,1:1,2:2}) --->將0列的空值填為0,1列的空值填為1,2列的空值填為2,默認為填充列
注意:fillna和dropna的特點,生成新的DataFrame,原來的DataFrame不變。
1、多重索引介紹
Series = pd.Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])
'1','2'為一級索引,'a','b','c'為二級索引
df 可以看做是索引的'1','2'的Series
Series['1'] -->Series
Series['1']['a'] -->value
Series[:,'a'] -->選擇'1'和'2'中的'a'對應的值
2、多重索引格式轉為二維DataFrame
df = Series.unstack() -->轉為二維DataFrame
3、多重索引在DataFrame中的操作
1、 map函數與apply函數、applymap函數的區別:
1)map函數對Series中的每個元素作用;
2)applymap函數對DataFrame中的每個元素作用;
3)apply函數對對DataFrame和Series的一列做整體運算。
2、Series.replace(to_replace=[2,3,4],values=[20,30,40]) 替換Series中多個值
Series.replace({1:10,2:20}) 將索引為1的值替換為10,將索引為2的值替換為20
df.sum() -->默認按照列進行求和,nan的值被忽略
df.min() -->默認按照列求最小值
df.max() -->默認按照列求最大值
df.mean() -->默認按照列求平均值
df.describe() -->默認按照列進行描述
df.sum(axis=1) -->按行求和,nan的值被忽略
#axis=0表示對橫軸進行操作,但是運算中表現為縱軸操作
#axis=1表示對縱軸進行操作,但是運算中表現為橫軸操作
bins = [0,59,70,80,100],bins是分割范圍
score_cat = pd.cut(Series,bins) --->得到catgory類型的數據
DataFrame的分箱技術很棒啊!
pd['catgory'] = pd.cut(df['a'],bins=[0,59,70,80,100],labels=['low','ok','good','great'])
-->新增一列,將a列的值按照labels進行分類標記,good!!!
#生成長度為3的隨機字元串 pd.util.testing.rands(3)
1、按照一列分組
g = df.groupby('city')
g是分組類型數據,列印不出來,所以看不到,但是有屬性和方法可以間接的了解
1) g.groups -->得到分的幾個組,和每個組包含的索引
2)g.get_group('BJ') -->得到'BJ'所對應的組
3)groupby = split +apply +combine
g.mean() -->求每組的平均值
g.max() -->求每組的最大值
g.min() -->求每組的最小值
g.count()
g.describe()
4)g是一個可迭代對象,可以用list函數將其轉化為list
list(g) -- > [('組名1',DataFrame1),('組名2',DataFrame2),(),()]
dict(list(g)) -->將其轉化為字典
同時可以通過for循環進行遍歷操作:for item,desc in g:print(item,desc)
#怪不得分組後不是DataFrame,因為元組的第一個元素是'分組名'。
2、按照多列分組
g_new = df.groupby(['city','wind'])
得到生成器((('分組1','分組2'),DataFrame),(),()...)
g_new.get_group(('分組1','分組2'))
for (name_1,name_2),group in g_new:
print((name_1,name_2),group)
g.mean() -->求每組的平均值
與g.agg('mean')方法一樣
pd.pivot_table(df,index=['',''],aggfuc='sum',values=['',''])
index是分組的組名,values是透視表呈現結果的列,columns是values下的分解
#感覺透視表呈現的結果就是groupby+agg後的結果
#分析者需要對數據結構有一定的了解
df.sort_values(by='',ascending=True/False)[:10] df可以索引
df.value_counts() -->按值計數
df.['a'] = df['b'].apply(lambda x:x>0) -->DataFrame中的True/False
通過g.size()可以看到被groupby之後的數據,得到的是一個Series
1、Series的排序:
1)對值進行排序
Series.sort_values() --->直接對Series的值進行排序
2)通過索引進行排序
Series.sort_index()
#默認都是升序排列
2、DataFrame的排序
df.sort_values(by='') -->按照某列的順序進行排序
df['a'].sort_values() -->返回對a列數據的排序結果,只返回a列
1、df.index = Series(['a','b','c']) 直接對index賦予新值
2、df.index = df.index.map(str.upper)
map函數中只傳入新的函數名即可
3、df.rename(index=str.upper,columns=str.lower)
或者傳遞字典,進行一一轉換
pd.merge(df1,df2,on=None,how='left/right/inner/outer')
pd.merge(df1,df2) -->沒有on參數默認先找相同的columns,然後在columns下找相同的values
pd.merge(df1,df2,on='columns') -->on參數是指按照指定列進行merge
left:表示以左邊的數據表為基準,進行填充右面的數據
right:表示以右邊的數據表為基準,填充左邊的數據
outer:以on的指定列的所有值為基準,填充兩邊的數據
inner:默認inner,相同on指定的columns下的相同values對應的左右兩邊的數據
1、concat拼接
pd.concat([Series1,Series2])
pd.concat([df1,df2]) -- >上下疊加,將沒有的列進行填充
2、combine組合
Series1.combine_first(Series2) -->用Series2的值去填充Series1中為空的值
df1.combine_first(df2) --->用df2將df1中的空值填充
df['A'] = df['A'].apply(str.upper) --->apply函數中也只輸入函數名
len(df) -->求df的長度
len(df['a'].unique()) -->查看a列中不重復數據的多少
Series.plicated() -->返回一列True/False的Series
Series.drop_plicates() -->刪除重復值
df.drop_plicates('a',keep='first/last')
df.drop_plicates() -->刪除完全重復的行
參數:'a'表示以a列為基準,刪除重復值
first表示保留第一個,last表示保留最後一個
data_list = pd.date_range(start,end,period='D',freq)
period='D',以天為單位
freq = 'W' 以周為單位
freq = 'W-Mon'以每周一位單位
freq = '5H' 以5h為單位
以data_range作為索引提取數據比較簡單
df[datetime(2017,9,1)]
df['2017-09-01']
df['20170901']
df['201709']
對時間序列數據進行分組聚合操作:
s1.resample('M').mean() -->以月為單位進行采樣,然後求每組的平均值
s1.resample('H').ffill() -->前項填充
s1.resample('H').bfill() -->後項填充
補充:1)jupyter中可以執行linux命令,太棒了!
!ls
!more xxx.csv
!pwd 等等
2)jupyter 查看函數幫助的快捷鍵:摁住shift + tab 棒!!!
I. 缺失值處理
缺失數據
1 缺失值的統計和刪除
1.1 缺失信息的統計
缺失數據可以使用 isna 或 isnull (兩個函數沒有區別)來查看每個單元格是否缺失,通過和 sum 的組合可以計算出每列缺失值的比例。
如果想要查看某一列缺失或者非缺失的行,可以利用 Series 上的 isna 或者 notna 進行布爾索引。例如,查看身高缺失的行:
如果想要同時對幾個列,檢索出全部為缺失或者至少有一個缺失或者沒有缺失的行,可以使用 isna, notna 和any, all 的組合。例如,對身高、體重和轉系情況這 3 列分別進行這三種情況的檢索
1.2 缺失信息的刪除
數據處理中經常需要根據缺失值的大小、比例或其他特徵來進行行樣本或列特徵的刪除,pandas 中提供了dropna 函數來進行操作。
dropna 的主要參數為軸方向 axis (默認為 0,即刪除行)、刪除方式 how 、刪除的非缺失值個數閾值 thresh(非缺失值沒有達到這個數量的相應維度會被刪除)、備選的刪除子集 subset ,其中 how 主要有 any 和 all兩種參數可以選擇。
2 缺失值的填充和插值
2.1 利用 fillna 進行填充
在 fillna 中有三個參數是常用的:value, method, limit 。其中,value 為填充值,可以是標量,也可以是索引到元素的字典映射;method 為填充方法,有用前面的元素填充 ffill 和用後面的元素填充 bfill 兩種類型,limit 參數表示連續缺失值的最大填充次數。
2.2 插值函數
在關於 interpolate 函數的 文檔 描述中,列舉了許多插值法,包括了大量 Scipy 中的方法。由於很多插值方法涉及到比較復雜的數學知識,因此這里只討論比較常用且簡單的三類情況,即線性插值、最近鄰插值和索引插值。
對於 interpolate 而言,除了插值方法(默認為 linear 線性插值)之外,有與 fillna 類似的兩個常用參數,一個是控制方向的 limit_direction ,另一個是控制最大連續缺失值插值個數的 limit 。其中,限制插值的方向默認為 forward ,這與 fillna 的 method 中的 ffill 是類似的,若想要後向限制插值或者雙向限制插值可以指定為 backward 或 both
關於 polynomial 和 spline 插值的注意事項
在 interpolate 中 如 果 選 用 polynomial 的 插 值 方 法, 它 內 部 調 用 的 是scipy.interpolate.interp1d(*,*,kind=order) , 這 個 函 數 內 部 調 用 的 是 make_interp_spline方法,因此其實是樣條插值而不是類似於 numpy 中的 polyfit 多項式擬合插值;而當選用 spline方法時,pandas 調用的是 scipy.interpolate.UnivariateSpline 而不是普通的樣條插值。這一部分的文檔描述比較混亂,而且這種參數的設計也是不合理的,當使用這兩類插值方法時,用戶一定要小心謹慎地根據自己的實際需求選取恰當的插值方法。
3 Nullable 類型
3.1 缺失記號及其缺陷
在 python 中的缺失值用 None 表示,該元素除了等於自己本身之外,與其他任何元素不相等:
在 numpy 中利用 np.nan 來表示缺失值,該元素除了不和其他任何元素相等之外,和自身的比較結果也返回False
值得注意的是,雖然在對缺失序列或表格的元素進行比較操作的時候,np.nan 的對應位置會返回 False ,但是在使用 equals 函數進行兩張表或兩個序列的相同性檢驗時,會自動跳過兩側表都是缺失值的位置,直接返回 True :
在時間序列的對象中,pandas 利用 pd.NaT 來指代缺失值,它的作用和 np.nan 是一致的
那麼為什麼要引入 pd.NaT 來表示時間對象中的缺失呢?仍然以 np.nan 的形式存放會有什麼問題?在 pandas中可以看到 object 類型的對象,而 object 是一種混雜對象類型,如果出現了多個類型的元素同時存儲在 Series中,它的類型就會變成 object
NaT 問題的根源來自於 np.nan 的本身是一種浮點類型,而如果浮點和時間類型混合存儲,如果不設計新的內置缺失類型來處理,就會變成含糊不清的 object 類型,這顯然是不希望看到的。
同時,由於 np.nan 的浮點性質,如果在一個整數的 Series 中出現缺失,那麼其類型會轉變為 float64 ;而如果在一個布爾類型的序列中出現缺失,那麼其類型就會轉為 object 而不是 bool
因此,在進入 1.0.0 版本後,pandas 嘗試設計了一種新的缺失類型 pd.NA 以及三種 Nullable 序列類型來應對這些缺陷,它們分別是 Int, boolean 和 string 。
3.2 Nullable 類型的性質
從字面意義上看 Nullable 就是可空的,言下之意就是序列類型不受缺失值的影響。例如,在上述三個 Nullable類型中存儲缺失值,都會轉為 pandas 內置的 pd.NA
在 Int 的序列中,返回的結果會盡可能地成為 Nullable 的類型
對於 boolean 類型的序列而言,其和 bool 序列的行為主要有兩點區別:
第一點是帶有缺失的布爾列表無法進行索引器中的選擇,而 boolean 會把缺失值看作 False
第二點是在進行邏輯運算時,bool 類型在缺失處返回的永遠是 False ,而 boolean 會根據邏輯運算是否能確定唯一結果來返回相應的值。那什麼叫能否確定唯一結果呢?舉個簡單例子:True | pd.NA 中無論缺失值為什麼值,必然返回 True ;False | pd.NA 中的結果會根據缺失值取值的不同而變化,此時返回 pd.NA ;False& pd.NA 中無論缺失值為什麼值,必然返回 False 。
3.3 缺失數據的計算和分組
當調用函數 sum, prob 使用加法和乘法的時候,缺失數據等價於被分別視作 0 和 1,即不改變原來的計算結果
當使用累計函數時,會自動跳過缺失值所處的位置:
當進行單個標量運算的時候,除了 np.nan ** 0 和 1 ** np.nan 這兩種情況為確定的值之外,所有運算結果全為缺失(pd.NA 的行為與此一致),並且 np.nan 在比較操作時一定返回 False ,而 pd.NA 返回 pd.NA
另外需要注意的是,diff, pct_change 這兩個函數雖然功能相似,但是對於缺失的處理不同,前者凡是參與缺失計算的部分全部設為了缺失值,而後者缺失值位置會被設為 0% 的變化率
對於一些函數而言,缺失可以作為一個類別處理,例如在 groupby, get_mmies 中可以設置相應的參數來進行增加缺失類別:
4 練習
4.1 Ex1:缺失值與類別的相關性檢驗
.4.2 Ex2:用回歸模型解決分類問題
J. python(pandas模塊)
1.什麼是pandas? numpy模塊和pandas模塊都是用於處理數據的模塊。 numpy主要用於針對數組進行統計計算,處理數字數據比較方便。 pandas除了可以處理數字數據,還可...