標籤:

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 |