python學習筆記二(pandas基礎)
大寫的吐槽:暑假提前結束,實驗室專案越來越緊,略煩躁(不喜歡做的專案),沒啥自由學習的時間了。只有抽些零散的時間去準備資料探勘比賽相關的東西。最近關注的大神 wepon,bryan的部落格,乾貨多多!
PS: 實驗室師兄們找工作也是壓力山大,祝他們好運!
物件屬性
首先匯入pandas:
from pandas import Series,DataFrame
import pandas as pd
重新索引
Series 物件的重新索引通過其 .reindex(index=None,**kwargs)
方法實現。**kwargs
中常用的引數有倆:method=None,fill_value=np.NaN
ser = Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c']) >>> a = ['a','b','c','d','e'] >>> ser.reindex(a) a -5.3 b 7.2 c 3.6 d 4.5 e NaN dtype: float64 >>> ser.reindex(a,fill_value=0) a -5.3 b 7.2 c 3.6 d 4.5 e 0.0 dtype: float64 >>> ser.reindex(a,method='ffill') a -5.3 b 7.2 c 3.6 d 4.5 e 4.5 dtype: float64 >>> ser.reindex(a,fill_value=0,method='ffill') a -5.3 b 7.2 c 3.6 d 4.5 e 4.5 dtype: float64
.reindex()
方法會返回一個新物件,其 index 嚴格遵循給出的引數,method:{'backfill', 'bfill', 'pad', 'ffill', None}
引數用於指定插值(填充)方式,當沒有給出時,自動用 fill_value 填充,預設為 NaN(ffill = pad,bfill = back fill
,分別指插值時向前還是向後取值)
DataFrame 物件的重新索引方法為:.reindex(index=None,columns=None,kwargs)。僅比 Series 多了一個可選的 columns 引數,用於給列索引。用法與上例類似,只不過插值方法 method 引數只能應用於行,即軸 0。DataFrame 物件的重新索引方法為:.reindex(index=None,columns=None,kwargs)。僅比 Series 多了一個可選的 columns 引數,用於給列索引。用法與上例類似,只不過插值方法 method 引數只能應用於行,即軸 0。
>>> data={'a':[1,3,5,7],'b':[2,4,6,8]}
>>> data
{'a': [1, 3, 5, 7], 'b': [2, 4, 6, 8]}
>>> df = DataFrame(data)
>>> df
a b
0 1 2
1 3 4
2 5 6
3 7 8
>>> state=['a','c','b']
>>> df.reindex(columns=state,method='ffill')
a c b
0 1 NaN 2
1 3 NaN 4
2 5 NaN 6
3 7 NaN 8
>>> df.reindex(index=[0,1,2,3,4],columns=state,method='ffill')
a c b
0 1 NaN 2
1 3 NaN 4
2 5 NaN 6
3 7 NaN 8
4 7 NaN 8
fill_value
仍然有效:
>>> df.reindex(index=[0,1,2,3,4],columns=state,fill_value=0)
a c b
0 1 0 2
1 3 0 4
2 5 0 6
3 7 0 8
4 0 0 0
刪除指定軸上的項
即刪除 Series 的元素或 DataFrame 的某一行(列)的意思,通過物件的 .drop(labels, axis=0) 方法:
>>> ser
d 4.5
b 7.2
a -5.3
c 3.6
dtype: float64
>>> df
a b
0 1 2
1 3 4
2 5 6
3 7 8
>>> ser.drop('c')
d 4.5
b 7.2
a -5.3
dtype: float64
>>> df.drop(2)
a b
0 1 2
1 3 4
3 7 8
>>> df.drop(['b'],axis=1)
a
0 1
1 3
2 5
3 7
>>> df.drop(['a','b'],axis=1)
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
.drop()
返回的是一個新物件,元物件不會被改變。
索引和切片
就像 Numpy,pandas 也支援通過 obj[::]
的方式進行索引和切片,以及通過布林型陣列進行過濾。
不過須要注意,因為 pandas 物件的 index 不限於整數,所以當使用非整數作為切片索引時,它是末端包含的。
>>> ser
d 4.5
b 7.2
a -5.3
c 3.6
dtype: float64
>>> ser[:2]
d 4.5
b 7.2
dtype: float64
>>> ser[:'c']
d 4.5
b 7.2
a -5.3
c 3.6
dtype: float64
當使用整數索引切片時,結果與 Python 列表或 Numpy 的預設狀況相同;換成 ‘c’ 這樣的字串索引時,結果就包含了這個邊界元素。
另外一個特別之處在於 DataFrame 物件的索引方式,因為他有兩個軸向(雙重索引)。
可以這麼理解:DataFrame 物件的標準切片語法為:.ix[::,::]
。ix 物件可以接受兩套切片,分別為行(axis=0)和列(axis=1)的方向:
>>> df
a b
0 1 2
1 3 4
2 5 6
3 7 8
>>> df.ix[:2,:2]
a b
0 1 2
1 3 4
2 5 6
>>> df.ix[:1,:'b']
a b
0 1 2
1 3 4
>>> df.ix[:0,:'a']
a
0 1
而不使用 ix ,直接切的情況就特殊了:
- 索引時,選取的是列
- 切片時,選取的是行
如下:
>>> df['a']
0 1
1 3
2 5
3 7
Name: a, dtype: int64
>>> df[:2]
a b
0 1 2
1 3 4
>>> df['b']
0 2
1 4
2 6
3 8
Name: b, dtype: int64
使用布林型陣列的情況,注意行與列的不同切法(列切法的 :
不能省):
>>> df['b']>4
0 False
1 False
2 True
3 True
Name: b, dtype: bool
>>> df[df['b']>4]
a b
2 5 6
3 7 8
>>> df.ix[:,df.ix[2]>5]
b
0 2
1 4
2 6
3 8
算術運算和資料對齊
pandas 最重要的一個功能是,它可以對不同索引的物件進行算術運算。在將物件相加時,結果的索引取索引對的並集。自動的資料對齊在不重疊的索引處引入空值,預設為 NaN。
>>> foo = Series({'a':1,'b':2})
>>> foo
a 1
b 2
dtype: int64
>>> bar = Series({'b':3,'d':4})
>>> bar
b 3
d 4
dtype: int64
>>> foo + bar
a NaN
b 5
d NaN
dtype: float64
DataFrame 的對齊操作會同時發生在行和列上。
當不希望在運算結果中出現 NA 值時,可以使用前面 reindex 中提到過 fill_value
引數,不過為了傳遞這個引數,就需要使用物件的方法,而不是操作符:df1.add(df2,fill_value=0)
。其他算術方法還有:sub(), div(), mul()
。
函式應用和對映
Numpy 的 ufuncs(元素級陣列方法)也可用於操作 pandas 物件。
當希望將函式應用到 DataFrame 物件的某一行或列時,可以使用 .apply(func, axis=0, args=(), **kwds)
方法。
>>> f = lambda x:x.max()-x.min()
>>> df
a b
0 1 2
1 3 4
2 5 6
3 7 8
>>> df.apply(f)
a 6
b 6
dtype: int64
>>> df.apply(f,axis=1)
0 1
1 1
2 1
3 1
dtype: int64
排序和排名
Series 的 sort_index(ascending=True)
方法可以對 index 進行排序操作,ascending 引數用於控制升序或降序,預設為升序。
若要按值對 Series 進行排序,當使用 .order()
方法,任何缺失值預設都會被放到 Series 的末尾。
在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True)
方法多了一個軸向的選擇引數與一個 by 引數,by 引數的作用是針對某一(些)列進行排序(不能對行使用 by 引數):
>>> df.sort_index(by=['a','b'],ascending=False)
a b
3 7 8
2 5 6
1 3 4
0 1 2
>>> df.sort_index(axis=1)
a b
0 1 2
1 3 4
2 5 6
3 7 8
>>> df.sort_index(axis=1,ascending=False)
b a
0 2 1
1 4 3
2 6 5
3 8 7
排名(Series.rank(method='average', ascending=True
))的作用與排序的不同之處在於,他會把物件的 values 替換成名次(從 1 到 n)。這時唯一的問題在於如何處理平級項,方法裡的 method
引數就是起這個作用的,他有四個值可選:average, min, max, first
。
>>> ser=Series([3,2,0,3],index=list('abcd'))
>>> ser
a 3
b 2
c 0
d 3
dtype: int64
>>> ser.rank()
a 3.5
b 2.0
c 1.0
d 3.5
dtype: float64
>>> ser.rank(method='max')
a 4
b 2
c 1
d 4
dtype: float64
>>> ser.rank(method='min')
a 3
b 2
c 1
d 3
dtype: float64
>>> ser.rank(method='first')
a 3
b 2
c 1
d 4
dtype: float64
注意在 ser[0]=ser[3] 這對平級項上,不同 method 引數表現出的不同名次。
DataFrame 的 .rank(axis=0, method=’average’, ascending=True) 方法多了個 axis 引數,可選擇按行或列分別進行排名。
統計方法
pandas 物件有一些統計方法。它們大部分都屬於約簡和彙總統計,用於從 Series 中提取單個值,或從 DataFrame 的行或列中提取一個 Series。
比如 DataFrame.mean(axis=0,skipna=True)
方法,當資料集中存在 NA 值時,這些值會被簡單跳過,除非整個切片(行或列)全是 NA,如果不想這樣,則可以通過 skipna=False
來禁用此功能:
>>> df = DataFrame(data,index=['one','two','three','four','five'],
... columns=['year','state','pop','debt'])
>>> df
year state pop debt
one 2000 Ohino 1.5 NaN
two 2001 Ohino 1.7 NaN
three 2002 Ohino 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
>>> df.mean()
year 2001.20
pop 2.42
dtype: float64
>>> df.mean(axis=1)
one 1000.75
two 1001.35
three 1002.80
four 1001.70
five 1002.45
>>> df.drop(['state'],axis=1)
year pop debt
one 2000 1.5 NaN
two 2001 1.7 NaN
three 2002 3.6 NaN
four 2001 2.4 NaN
five 2002 2.9 NaN
>>> df=df.drop(['state'],axis=1)
>>> df
year pop debt
one 2000 1.5 NaN
two 2001 1.7 NaN
three 2002 3.6 NaN
four 2001 2.4 NaN
five 2002 2.9 NaN
>>> df.mean()
year 2001.20
pop 2.42
debt NaN
dtype: float64
>>> df.mean(axis=1)
one 1000.75
two 1001.35
three 1002.80
four 1001.70
five 1002.45
dtype: float64
>>> df.mean(axis=1,skipna=False)
one NaN
two NaN
three NaN
four NaN
five NaN
dtype: float64
統計方法還有很多,就不一一列舉了。
處理缺失資料
pandas 中 NA 的主要表現為 np.nan,另外 Python 內建的 None 也會被當做 NA 處理。
處理 NA 的方法有四種:dropna , fillna , isnull , notnull
。
is(not)null
這一對方法對物件做元素級應用,然後返回一個布林型陣列,一般可用於布林型索引。
dropna
對於一個 Series,dropna 返回一個僅含非空資料和索引值的 Series。
問題在於對 DataFrame 的處理方式,因為一旦 drop 的話,至少要丟掉一行(列)。這裡的解決方式與前面類似,還是通過一個額外的引數:dropna(axis=0, how='any', thresh=None)
,how 引數可選的值為 any 或者 all。all 僅在切片元素全為 NA 時才拋棄該行(列)。另外一個有趣的引數是 thresh,該引數的型別為整數,它的作用是,比如 thresh=3,會在一行中至少有 3 個非 NA 值時將其保留。
fillna
fillna(value=None, method=None, axis=0)
中的 value 引數除了基本型別外,還可以使用字典,這樣可以實現對不同的列填充不同的值。method 的用法與前面 .reindex() 方法相同,這裡不再贅述。
inplace 引數
Series 和 DataFrame 物件的方法中,凡是會對陣列作出修改並返回一個新陣列的,往往都有一個 replace=False
的可選引數。如果手動設定為 True,那麼原陣列就可以被替換。
8/16/2016 11:33:45 PM 睡覺。明天繼續,加油。