Python數據分析4——Pandas數據結構之DataFrame
這一部分主要學習pandas中基於前面兩種數據結構的基本操作。
設有DataFrame結果的數據a如下所示:
一、查看數據(查看對象的方法對於Series來說同樣適用)
1.查看DataFrame前xx行或後xx行
a=DataFrame(data);a.head(6)表示顯示前6行數據,若head()中不帶參數則會顯示全部數據。
a.tail(6)表示顯示後6行數據,若tail()中不帶參數則也會顯示全部數據。import pandas as pdimport numpy as npa=pd.DataFrame([[4,1,1],[6,2,0],[6,1,6]],index=[one,two,three],columns=[a,b,c])a
a.head(2)
a.tail(2)
2.查看DataFrame的index,columns以及values
a.index ; a.columns ; a.values 即可a.indexIndex([uone, utwo, uthree], dtype=object)
a.columnsIndex([ua, ub, uc], dtype=object)
a.valuesarray([[4, 1, 1], [6, 2, 0], [6, 1, 6]])
3.describe()函數對於數據的快速統計匯總
a.describe()對每一列數據進行統計,包括計數,均值,std,各個分位數等。
a.describe<bound method DataFrame.describe of a b cone 4 1 1two 6 2 0three 6 1 6>
4.對數據的轉置
a.T
a.T
5.對軸進行排序
a.sort_index(axis=1,ascending=False);其中axis=1表示對所有的columns進行排序,下面的數也跟著發生移動。後面的ascending=False表示按降序排列,參數缺失時默認升序。a.sort_index(axis=1,ascending=False);a
6.對DataFrame中的值排序
a.sort(columns=』x』)即對a中的x這一列,從小到大進行排序。注意僅僅是x這一列,而上面的按軸進行排序時會對所有的columns進行操作。a.sort(columns=c)
二、選擇對象
1.選擇特定列和行的數據
a[『x』] 那麼將會返回columns為x的列,注意這種方式一次只能返回一個列。a.x與a[『x』]意思一樣。取行數據,通過切片[]來選擇
如:a[0:3] 則會返回前三行的數據。a[a]one 4two 6three 6Name: a, dtype: int64
a[0:2]
2.通過標籤來選擇
a.loc[『one』]則會默認表示選取行為』one』的行;a.loc[:,[『a』,』b』] ] 表示選取所有的行以及columns為a,b的列;
a.loc[[『one』,』two』],[『a』,』b』]] 表示選取』one』和』two』這兩行以及columns為a,b的列;
a.loc[『one』,』a』]與a.loc[[『one』],[『a』]]作用是一樣的,不過前者只顯示對應的值,而後者會顯示對應的行和列標籤。
3.通過位置來選擇
這與通過標籤選擇類似
a.iloc[1:2,1:2] 則會顯示第一行第一列的數據;(切片後面的值取不到)a.iloc[1:2] 即後面表示列的值沒有時,默認選取行位置為1的數據;
a.iloc[[0,2],[1,2]] 即可以自由選取行位置,和列位置對應的數據。
a.iloc[1:2,1:2]
4.使用條件來選擇
使用單獨的列來選擇數據a[a.c>0] 表示選擇c列中大於0的數據a[a.c>0]
使用where來選擇數據
a[a>0] 表直接選擇a中所有大於0的數據a[a>0]
使用isin()選出特定列中包含特定值的行
a1=a.copy()a1[a1[『one』].isin([『2′,』3′])] 表顯示滿足條件:列one中的值包含』2』,』3』的所有行。a1=a.copy()a1[a1[a].isin([4])]
三、設置值(賦值)
賦值操作在上述選擇操作的基礎上直接賦值即可。
例a.loc[:,[『a』,』c』]]=9 即將a和c列的所有行中的值設置為9
a.iloc[:,[1,3]]=9 也表示將a和c列的所有行中的值設置為9同時也依然可以用條件來直接賦值
a[a>0]=-a 表示將a中所有大於0的數轉化為負值
a.loc[:,[a,c]]=9a
a.iloc[:,[0,1,2]]=7a
a[a>0]=-aa
四、缺失值處理
在pandas中,使用np.nan來代替缺失值,這些值將默認不會包含在計算中。
1.reindex()方法
用來對指定軸上的索引進行改變/增加/刪除操作,這將返回原始數據的一個拷貝。
a.reindex(index=list(a.index)+[『five』],columns=list(b.columns)+[『d』])a.reindex(index=[『one』,』five』],columns=list(b.columns)+[『d』])
即用index=[]表示對index進行操作,columns表對列進行操作。
b=a.reindex(index=list(a.index)+[four],columns=list(a.columns)+[d])c=b.copy()c
2.對缺失值進行填充
a.fillna(value=x)表示用值為x的數來對缺失值進行填充b.fillna(value=100)
3.去掉包含缺失值的行
a.dropna(how=』any』)
表示去掉所有包含缺失值的行c.dropna(how=any)
五、合併
1.contact
contact(a1,axis=0/1,keys=[『xx』,』xx』,』xx』,…]),其中a1表示要進行連接的列表數據,axis=1時表橫著對數據進行連接。axis=0或不指定時,表將數據豎著進行連接。a1中要連接的數據有幾個則對應幾個keys,設置keys是為了在數據連接以後區分每一個原始a1中的數據。例:a1=[b[『a』],b[『c』]]
result=pd.concat(a1,axis=1,keys=[『1′,』2』])a1=[b[a],b[c]]d=pd.concat(a1,axis=1,keys=[1,2])d
2.Append 將一行或多行數據連接到一個DataFrame上
a.append(a[2:],ignore_index=True)
表示將a中的第三行以後的數據全部添加到a中,若不指定ignore_index參數,則會把添加的數據的index保留下來,若ignore_index=Ture則會對所有的行重新自動建立索引。a.append(a[2:],ignore_index=True)
3.merge類似於SQL中的join
設a1,a2為兩個dataframe,二者中存在相同的鍵值,兩個對象連接的方式有下面幾種:(1)內連接,pd.merge(a1, a2, on=』key』)(2)左連接,pd.merge(a1, a2, on=』key』, how=』left』)(3)右連接,pd.merge(a1, a2, on=』key』, how=』right』)(4)外連接, pd.merge(a1, a2, on=』key』, how=』outer』)至於四者的具體差別,具體學習參考sql中相應的語法。pd.merge(b,c,on=a)
六、分組(groupby)
用pd.date_range函數生成連續指定天數的的日期
pd.date_range(『20000101』,periods=10)def shuju():
data={
『date』:pd.date_range(『20000101』,periods=10),
『gender』:np.random.randint(0,2,size=10),
『height』:np.random.randint(40,50,size=10),
『weight』:np.random.randint(150,180,size=10)
}
a=DataFrame(data)
print(a)
date gender height weight
0 2000-01-01 0 47 165
1 2000-01-02 0 46 179
2 2000-01-03 1 48 172
3 2000-01-04 0 45 173
4 2000-01-05 1 47 151
5 2000-01-06 0 45 172
6 2000-01-07 0 48 167
7 2000-01-08 0 45 157
8 2000-01-09 1 42 157
9 2000-01-10 1 42 164
用a.groupby(『gender』).sum()得到的結果為: #注意在python中groupby(」xx)後要加sum(),不然顯示
不了數據對象。
gender height weight
0 256 989
1 170 643
此外用a.groupby(『gender』).size()可以對各個gender下的數目進行計數。
所以可以看到groupby的作用相當於:
按gender對gender進行分類,對應為數字的列會自動求和,而為字元串類型的列則不顯示;當然也可以同時groupby([『x1′,』x2』,…])多個欄位,其作用與上面類似。a2=pd.DataFrame({ date:pd.date_range(20000101,periods=10), gender:np.random.randint(0,2,size=10), height:np.random.randint(40,50,size=10), weight:np.random.randint(150,180,size=10) })print(a2) date gender height weight0 2000-01-01 0 43 1511 2000-01-02 1 40 1712 2000-01-03 1 49 1693 2000-01-04 1 48 1654 2000-01-05 0 42 1595 2000-01-06 1 48 1526 2000-01-07 0 48 1547 2000-01-08 1 40 1518 2000-01-09 0 41 1589 2000-01-10 0 44 175
a2.groupby(gender).sum()
七、Categorical按某一列重新編碼分類
如六中要對a中的gender進行重新編碼分類,將對應的0,1轉化為male,female,過程如下:
a[『gender1』]=a[『gender』].astype(『category』)
a[『gender1』].cat.categories=[『male』,』female』] #即將0,1先轉化為category類型再進行編碼。
print(a)得到的結果為:
date gender height weight gender1
0 2000-01-01 1 40 163 female
1 2000-01-02 0 44 177 male
2 2000-01-03 1 40 167 female
3 2000-01-04 0 41 161 male
4 2000-01-05 0 48 177 male
5 2000-01-06 1 46 179 female
6 2000-01-07 1 42 154 female
7 2000-01-08 1 43 170 female
8 2000-01-09 0 46 158 male
9 2000-01-10 1 44 168 female
所以可以看出重新編碼後的編碼會自動增加到dataframe最後作為一列。
a2[gender1]=a2[gender].astype(category)a2[gender1].cat.categories=[male,female]a2
八、相關操作
描述性統計:
1.a.mean() 默認對每一列的數據求平均值;若加上參數a.mean(1)則對每一行求平均值;a2.mean()gender 0.5height 44.3weight 160.5dtype: float64
2.統計某一列x中各個值出現的次數:a[『x』].value_counts();
a2[height].value_counts()0 64.6666671 70.6666672 73.0000003 71.3333334 67.0000005 67.0000006 67.3333337 64.0000008 66.3333339 73.000000dtype: float64
3.對數據應用函數
a.apply(lambda x:x.max()-x.min())表示返回所有列中最大值-最小值的差。d.apply(lambda x:x.max()-x.min())1 02 0dtype: float64
4.字元串相關操作
a[『gender1』].str.lower() 將gender1中所有的英文大寫轉化為小寫,注意dataframe沒有str屬性,只有series有,所以要選取a中的gender1欄位。a2[gender1].str.lower()0 male1 female2 female3 female4 male5 female6 male7 female8 male9 maleName: gender1, dtype: object
九、時間序列
在六中用pd.date_range(『xxxx』,periods=xx,freq=』D/M/Y….』)函數生成連續指定天數的的日期列表。
例如pd.date_range(『20000101』,periods=10),其中periods表示持續頻數;pd.date_range(『20000201′,』20000210′,freq=』D』)也可以不指定頻數,只指定其實日期。此外如果不指定freq,則默認從起始日期開始,頻率為day。其他頻率表示如下:
print(pd.date_range(20000201,20000210,freq=D))DatetimeIndex([2000-02-01, 2000-02-02, 2000-02-03, 2000-02-04, 2000-02-05, 2000-02-06, 2000-02-07, 2000-02-08, 2000-02-09, 2000-02-10], dtype=datetime64[ns], freq=D)
print(pd.date_range(20000201,periods=5))DatetimeIndex([2000-02-01, 2000-02-02, 2000-02-03, 2000-02-04, 2000-02-05], dtype=datetime64[ns], freq=D)
十、畫圖(plot)
在pycharm中首先要:import matplotlib.pyplot as plt
a=Series(np.random.randn(1000),index=pd.date_range(『20100101』,periods=1000))
b=a.cumsum()
b.plot()
plt.show() #最後一定要加這個plt.show(),不然不會顯示出圖來。
import matplotlib.pyplot as plta=pd.Series(np.random.randn(1000),index=pd.date_range(20150101,periods=1000))b=a.cumsum()b.plot()plt.show()
也可以使用下面的代碼來生成多條時間序列圖:
a=DataFrame(np.random.randn(1000,4),index=pd.date_range(『20100101』,periods=1000),columns=list(『ABCD』))
b=a.cumsum()
b.plot()
plt.show()
a=pd.DataFrame(np.random.randn(1000,4),index=pd.date_range(20150101,periods=1000),columns=list(ABCD))b=a.cumsum()b.plot()plt.show()
推薦閱讀:
※Python面試之 is 和 == 的區別
※Hello World!
※在Python里實現Lazy
※scala和groovy的優勢有哪些?
TAG:Python |