1. 程式人生 > >Python 資料處理擴充套件包: pandas 模組的DataFrame介紹(建立和基本操作)

Python 資料處理擴充套件包: pandas 模組的DataFrame介紹(建立和基本操作)

DataFrame是Pandas中的一個表結構的資料結構,包括三部分資訊,表頭(列的名稱),表的內容(二維矩陣),索引(每行一個唯一的標記)。

一、DataFrame的建立

有多種方式可以建立DataFrame,下面舉例介紹。

例1: 通過list建立

複製程式碼
>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[4,5,6]])
>>> df
   0  1  2
0  1  2  3
1  4  5  6

[2 rows x 3 columns]
複製程式碼

上面代表,建立了一個2行3列的表格,建立時只指定了表格的內容(通過一個巢狀的list),沒有指定列名和索引。
這時列名就自動為 0,1,2 ;索引自動為數值0,1.

我們可以指定列表和索引,如:

複製程式碼
>>> df = pd.DataFrame([[1,2,3],[4,5,6]],index=['row1','row2'],columns=['c1','c2','c3'])
>>> df
      c1  c2  c3
row1   1   2   3
row2   4   5   6

[2 rows x 3 columns]
複製程式碼

可以看出,上面程式碼通過index和 columns引數指定了索引和列名。

例2:建立例子

複製程式碼
>>> import numpy as np
>>> dates = pd.date_range('
20121001',periods=6) >>> df = pd.DataFrame(np.random.randn(6,4) , index = dates,columns=list('abcd')) >>> df a b c d 2012-10-01 -0.236220 0.586985 0.784953 -0.507129 2012-10-02 -1.020807 -1.316997 -0.747997 1.909333 2012-10-03 0.085208 -0.281736 1.112287 1.572577 2012-10-04 0.008708 -0.925711 -0.615752 -1.183397 2012-10-05 1.158198 -1.393678 0.586624 0.202499 2012-10-06 1.149878 -2.383863 1.646403 1.647935 [
6 rows x 4 columns]
複製程式碼

上面程式碼建立的dates是個時間索引,np.random.randn 方法建立一個6行4列的隨機數矩陣。
最後的df使用 dates作為索引,使用np.random.randn 方法建立的矩陣作為內容,使用 list('abcd')作為列名。

二、 DataFrame的一些基本操作

1、獲取資料的行數

len(df)

len(df.index)

2、顯示索引、列和底層的numpy資料

複製程式碼
>>> df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-10-01, ..., 2012-10-06]
Length: 6, Freq: D, Timezone: None
>>> df.columns
Index([u'a', u'b', u'c', u'd'], dtype='object')
>>> df.values
array([[-0.2362202 ,  0.58698529,  0.78495289, -0.50712897],
       [-1.02080723, -1.31699704, -0.74799734,  1.90933343],
       [ 0.08520807, -0.28173589,  1.11228743,  1.57257716],
       [ 0.00870768, -0.92571109, -0.6157519 , -1.18339719],
       [ 1.15819829, -1.39367835,  0.586624  ,  0.20249899],
       [ 1.14987847, -2.38386297,  1.64640287,  1.64793523]])
複製程式碼

說明,這個例子中的df使用的是上面建立的 DataFrame物件

3、顯示資料

df.head([n])  # 獲取df中的前n行資料,n不指定,則預設為5

df.tail([n])  # 獲取df中的後n行資料,n不指定,則預設為5

複製程式碼
>>> dates = pd.date_range('20121001',periods=100)
>>>df = pd.DataFrame(np.random.randn(100,4) , index = dates,columns=list('abcd' ))  
>>> df.head()
                   a         b         c         d
2012-10-01 -1.010746  0.176277 -0.838870  0.742626
2012-10-02  0.111174  0.182840  0.193215  1.517350
2012-10-03 -0.757385  1.137521 -0.247181  0.659187
2012-10-04 -1.157838  1.464957 -2.106226  1.160796
2012-10-05  0.141747  0.032917  0.647210 -0.861413

[5 rows x 4 columns]
>>> df.tail()
                   a         b         c         d
2013-01-04 -0.225416 -1.436526 -0.349813 -0.130948
2013-01-05 -1.544653 -0.214760  1.455662  0.050591
2013-01-06  0.582737 -0.646163 -1.763772 -1.463706
2013-01-07 -0.694467  0.710954 -2.227337 -0.257376
2013-01-08  0.282839 -1.100346  1.526374  1.658781
複製程式碼

注意,head 和 tail 返回的是一個新的dataframe,與原來的無關 

4、按照索引排序

newdf = df.sort_index(ascending=False,inplace=True)

ascending=False 引數指定按照索引值的以降序方式排序,預設是以升序排序。

inplace=True 指定為True時,表示會直接對df中的資料進行排序,函式返回值為None,newdf的值為None;

如果不設定為True(預設為false),則不會對df中資料進行修改,會返回一個新的df,這時newdf就有內容,是一個新的排序後的df。

5、新增資料(append方法)

 append方法可以新增資料到一個dataframe中,注意append方法不會影響原來的dataframe,會返回一個新的dataframe。

語法:

DataFrame.append(otherDataignore_index=False, verify_integrity=False)

 其中otherData引數是要新增的新資料,支援多種格式。

ignore_index 引數預設值為False,如果為True,會對新生成的dataframe使用新的索引(自動產生),忽略原來資料的索引。

verify_integrity引數預設值為False,如果為True,當ignore_index為False時,會檢查新增的資料索引是否衝突,如果衝突,則會新增失敗。

舉例說明1:

複製程式碼
dates = pd.date_range('20121001',periods=10)
df = pd.DataFrame(np.random.randn(10,4) , index = dates,columns=list('abcd')) 

dates1 = pd.date_range('20121001',periods=2)
df1 = pd.DataFrame(np.random.randn(2,4) , index = dates1,columns=list('abcd')) 

df.append(df1) # df1中的2行資料會加到df中,且新產生的df的各行的索引就是原來資料的索引
df.append(df1,ignore_index=True) # df1中的2行資料會加到df中,且新產生的df的索引會重新自動建立
df.append(df1,verify_integrity=True) #會報錯,因為df1的索引和df2的索引衝突了
複製程式碼

說明,df1的列名必須和df一致,否則不是簡單的新增行。而是會新增列,再新增行。

舉例2:

複製程式碼
>>> df.append({'a':10,'b':11,'c':12,'d':13},ignore_index=True)
            a          b          c          d
0   -0.471061  -0.937725  -1.444073   0.640439
1   -0.732039  -1.617755   0.281875   1.179076
2    1.115559   0.136407  -2.225551   0.119433
3    0.695137   0.380088  -0.318689  -0.048248
4    1.483151  -0.124202  -0.722126   0.035601
5    0.326048  -0.139576  -0.172726   0.931670
6    0.858305   0.857661  -0.279078   0.583740
7   -0.041902   0.408085  -1.019313   0.005968
8    0.626730   0.143332  -0.404894   0.377950
9   -1.850168   0.430794  -0.534981  -0.738701
10  10.000000  11.000000  12.000000  13.000000
複製程式碼

上面程式碼是新產生的df會新增一行。這種操作,ignore_index引數值必須設定為True,否則會報錯。

舉例3:

複製程式碼
>>> df.append({'e':10},ignore_index=True)
           a         b         c         d   e
0  -0.471061 -0.937725 -1.444073  0.640439 NaN
1  -0.732039 -1.617755  0.281875  1.179076 NaN
2   1.115559  0.136407 -2.225551  0.119433 NaN
3   0.695137  0.380088 -0.318689 -0.048248 NaN
4   1.483151 -0.124202 -0.722126  0.035601 NaN
5   0.326048 -0.139576 -0.172726  0.931670 NaN
6   0.858305  0.857661 -0.279078  0.583740 NaN
7  -0.041902  0.408085 -1.019313  0.005968 NaN
8   0.626730  0.143332 -0.404894  0.377950 NaN
9  -1.850168  0.430794 -0.534981 -0.738701 NaN
10       NaN       NaN       NaN       NaN  10
複製程式碼

可以看出,如果插入的資料,指定的列名不存在,新產生的df不僅會增加行,還會增加列。

6、遍歷資料

 示例程式碼如下

for index,row in df.iterrows():
    print index #獲取行的索引
    print row.a #根據列名獲取欄位
    print row[0]#根據列的序號(從0開始)獲取欄位


7、查詢資料

建立如下的dataframe

dates = pd.date_range('20121001',periods=10)
df = pd.DataFrame(np.random.randn(10,4) , index = dates,columns=list('abcd'))

可以有各種方式獲取df中的全部或部分資料

df['a']  #按照列名獲取指定的列,返回的是一個Series,其中key是索引,value是該列對應的欄位值

df[:2] #獲取前2行資料,效果等同 df[0:2],返回的是一個新的dataframe

df[2:5] #獲取第3行~5行 這3條記錄,返回的是一個新的dataframe

df.loc['20121009'] #獲取指定索引的行,等同於  df.loc['2012-10-09'],返回的是一個Series,其中key是列名,value是該列對應的欄位值

df.iloc[3]  #獲取指定序號的行,這裡是第4行

8、刪除資料

del df['a']  #刪除dataframe中指定的列,這個是直接影響當前的dataframe,注意 del不是函式,是python中的內建語句,沒有返回值

df.drop(['a'],axis=1)  #刪除指定的列,與上面的區別是不會影響原來的dataframe,dop方法會返回一個刪除了指定列的新的dataframe

說明,dop方法既可以刪除列,也可以刪除行,但上面建立的df無法被刪除行(?),下面這個例子可以刪除行

data = pd.DataFrame(np.arange(16).reshape((4, 4)),index=['Ohio', 'Colorado', 'Utah', 'New York'],columns=['one', 'two', 'three', 'four'])

data.drop(['Colorado', 'Ohio'])

上面程式碼中的dop方法刪除了指定索引的兩行,注意同刪除列一樣,drop方法不會影響原來的dataframe,會返回一個刪除後的新的dataframe

9、增加列

例子程式碼如下

dates = pd.date_range('20121001',periods=10)
df = pd.DataFrame(np.random.randn(10,3) , index = dates,columns=list('abc')) 

df['d'] = pd.Series(np.random.randn(10),index=df.index)

上面程式碼先是建立了一個dataframe,然後通過df['d'] 插入了一個新的列。如果指定的列名存在,會修改列的內容。

10、修改指定行或單元格資料

df.values[i][j]= xxx  #其中i是行號,j是列號,都是從0開始

df.values[1]=12  # 會把一行中的所有列中的資料設定為同一個值,這裡的引數1是序號,這裡為第2行資料

df['a'] = 12  #這樣會把指定列的所有資料都設定為同一個值,如這裡的12。注意,如果指定的列名不存在,會新增列

11、插入行

前面介紹的append方法是產生一個新的 dataframe,不會改變原來的dataframe。

那有沒有辦法直接在當前的frame中插入一行資料呢?  上面介紹的 df[列名] = xxx 是用來插入或修改列的資訊。