筆記|數據分析之pandas基礎----數據結構Series與DataFrame

pandas

在pandas中接下來要經常用到的數據結構就是Series和DataFrame了。這兩個對象為大多數數據處理提供了可靠、易于使用的功能

Series

Series是由一組數據以及這組數據所對應的數據標簽(即索引)組成。

In [66]: obj = Series([4, 7, -5, 3])

In [67]: obj
Out[67]:
0    4
1    7
2   -5
3    3
dtype: int64

其中左邊的一列數字即為索引,索引默認是0到N-1的數字。

自定義索引

我們可以通過設置index屬性來自定義索引的表現形式。

In [68]: obj2 = Series([4, 7, -5, 3],index = ['d','b','a','c'])

In [69]: obj2
Out[69]:
d    4
b    7
a   -5
c    3
dtype: int64
Series索引的應用
In [70]: obj2['a']
Out[70]: -5

In [71]: obj2['d'] = 6

In [72]: obj2
Out[72]:
d    6
b    7
a   -5
c    3
dtype: int64

In [74]: obj2[['a','b','c']]
Out[74]:
a   -5
b    7
c    3
dtype: int64

In [79]: obj2[['a','b','c']] = 1

In [80]: obj2
Out[80]:
d    6
b    1
a    1
c    1
dtype: int64

我們可以通過直接索引的方式來取出一個值或者一組值,也可以像NumPy一樣可以對它們進行賦值。

Series的運算
In [83]: obj2[obj2 > 0]
Out[83]:
d    4
b    7
c    3
dtype: int64
In [84]: obj2 * 2
Out[84]:
d     8
b    14
a   -10
c     6
dtype: int64

NumPy的運算函數也支持Series對象

In [85]: np.exp(obj2)
Out[85]:
d      54.598150
b    1096.633158
a       0.006738
c      20.085537
dtype: float64
Series和Python字典的關系
In [88]: sdata = {'Ohio': 35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000}

In [89]: obj3 = Series(sdata)

In [90]: 
Out[90]:
Ohio      35000
Texas     71000
Oregon    16000
Utah       5000
dtype: int64

如果單單傳入一個字典,那么最終得到的Series對象中的索引值就是字典的鍵值。

In [91]: states = ['California', 'Ohio', 'Oregon','Texas']
In [92]: obj4 = Series(sdata, index=states)

In [93]: obj4
Out[93]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64

在上面這個替換索引的例子中,sdata中的鍵值(索引)與states中相匹配的三個值會被找出來作了替換,但是California這個索引在sdata中不存在,所以它的結果為NaN。在pandas中,NaN表示缺失數據。

如果傳入多個字典,那結果會和上面的例子截然相反

In [94]: sdata2 = {'Ohios': 35000, 'Texass':71000, 'Oregons':16000, 'Utahs':5000}

In [95]: obj3 = Series([sdata,sdata2])

In [96]: obj3
Out[96]:
0    {'Ohio': 35000, 'Texas': 71000, 'Oregon': 1600...
1    {'Ohios': 35000, 'Texass': 71000, 'Oregons': 1...
dtype: object

它會得到一個以傳入的字典為值,0到N-1為索引的Series對象。

DataFrame

DataFrame是一個表格型數據,它含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾值等)。DataFrame既有行索引也有列索引,可以把它想象成Excel表。DataFrame中數據是以一個或者多個二維塊存放的(而不是列表、字典或別的一堆數據結構)。

如何構建DataFrame

直接傳入一個等長列表或者NumPy數組組成的字典:

In [103]: data = {'state':['Ohio','Ohio','Ohio','Neveda','Neveda'],'year':[2000, 2001, 2002, 2001, 2002],
     ...: 'pop':[1.5, 1.7, 3.6, 2.4, 2.9]}

In [104]: frame = DataFrame(data)

In [105]: frame
Out[105]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Neveda  2001  2.4
4  Neveda  2002  2.9

同樣DataFrame會自動加上索引,并且全部列會被有序排列。因為數據會打亂行索引,所以數據不會被自動排序。

如果不想排序列,那我們可以預先指定列的序列:

In [106]: DataFrame(data, columns=['year','state','pop'])
Out[106]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Neveda  2.4
4  2002  Neveda  2.9

這樣就可以按照我們指定的序列來排序所有的列。

如何獲取DataFrame中的列

可以通過屬性(只讀)的方式或者類似字典標記(讀寫)的方式獲得:

In [107]: frame = DataFrame(data, columns=['year','state','pop'])

In [108]: frame
Out[108]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Neveda  2.4
4  2002  Neveda  2.9

In [109]: frame.year
Out[109]:
0    2000
1    2001
2    2002
3    2001
4    2002
Name: year, dtype: int64
In [110]: frame['year']
Out[110]:
0    2000
1    2001
2    2002
3    2001
4    2002
Name: year, dtype: int64
如何獲取DataFrame中的某行數據
frame.loc[0]
Out[111]:
year     2000
state    Ohio
pop       1.5
Name: 0, dtype: object
In [114]: frame = DataFrame(data, columns=['year','state','pop'],index=['one','two','three','four','five'
     ...: ])

In [115]: frame.loc['two']
Out[115]:
year     2001
state    Ohio
pop       1.7
Name: two, dtype: object

可以通過DataFrame的loc函數來取出行數據。

對列進行修改

上面有說到過DataFrame獲取列的讀寫權限,屬性的方法只能讀,通過字典標記形式可以進行寫入操作。

In [122]: frame['num'] = 16

In [123]: frame
Out[123]:
       year   state  pop  num
one    2000    Ohio  1.5   16
two    2001    Ohio  1.7   16
three  2002    Ohio  3.6   16
four   2001  Neveda  2.4   16
five   2002  Neveda  2.9   16
In [120]: frame.num = 16

In [121]: frame
Out[121]:
       year   state  pop
one    2000    Ohio  1.5
two    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Neveda  2.4
five   2002  Neveda  2.9

也可以將列表或者數組賦值給它,但是要注意它的長度是否相匹配。

In [144]: frame['num'] = [5, 4, 3, 2, 1]

In [145]: frame
Out[145]:
       year   state  pop  num
one    2000    Ohio  1.5    5
two    2001    Ohio  1.7    4
three  2002    Ohio  3.6    3
four   2001  Neveda  2.4    2
five   2002  Neveda  2.9    1

如果將一個Series賦值給它,就會精確的匹配到DataFrame的索引。

In [146]: val = Series([-1.2, -1.5, -1.7],index=['two','four','five'])

In [147]: frame['val'] = val

In [148]: frame
Out[148]:
       year   state  pop  num  val
one    2000    Ohio  1.5    5  NaN
two    2001    Ohio  1.7    4 -1.2
three  2002    Ohio  3.6    3  NaN
four   2001  Neveda  2.4    2 -1.5
five   2002  Neveda  2.9    1 -1.7

如果有空位,將會自動填上NaN值。在賦值過程中,如果將要賦值的列不存在,那它會自動創(chuàng)建一個新列。

DataFrame的構造函數能接受的所有數據類型
  • 二維ndarray 數據矩陣,還可以傳入行標和列標
  • 由數組、列表或元組組成的字典 每個序列會變成DataFrame的一列。所有序列的長度必須相同。
  • NumPy的結構化數組/記錄數組 類似于“由數組組成的字典”
  • 由Series組成的字典 每個Series都會成為一列。如果沒有指定行索引,則各Series的索引會被合并成結果的行索引。 每個Series的列索引就是在該字典中的鍵。
  • 由字典組成的字典 各內層字典會成為一列。鍵會被合并成結果的行索引,跟“由Series組成的字典”一樣。
  • 字典或Series的列表 各項將會成為DataFrame的一行。字典鍵或Series索引的并集將會成為DataFrame的列標。
  • 由列標或元組組成的列表 類似于"二維ndarray"
  • 另一個DataFrame 該DataFrame的索引會被沿用,除非指定了其他索引。
  • NumPy的MaskedArray 類似于"二維ndarray"的情況,只是掩碼值在DataFrame會變成NA/缺失值。

總結

今天學習了Series和DataFrame的數據結構部分。了解了它們的構建方式
Series的構建方式: data = Series([1, 2, 3]) 或者通過傳入一個字典來創(chuàng)建Series
Series的常用功能:
Series自定義索引名稱 通過在構造函數中設置索引名稱來達到自定義索引的目的
Series索引的一些玩法 我們可以通過字典的形式data['one']來獲得數據,也可以將其中的參數組成一個數組來獲取多個數據data[['one','two','three']]。
Series的運算 Series可以像NumPy一樣支持數學運算,并且它的運算方式也和NumPy一樣數據批量運算。

DataFrame的構建方式:直接傳入一個等長列表或者NumPy數組組成的字典。
如何獲取DataFrame中的數據 由于DataFrame是個表格型數據,數據也有兩種類型:行數據列數據,以點屬性的方式frame.year或者字典形式frame['year']都可以獲得列數據。值得注意的是,點屬性是獲取的是帶有只讀屬性的數據,而字典形式的則是帶有讀寫形式的數據。如果想要修改數據還是得用字典形式來獲取數據比較好。
如果是想獲取行數據,可以通過loc函數來獲取。例如通過行索引名稱frame.loc['id'] 或者行索引序列號frame.loc[0] 來獲取。
DataFrame的賦值 可以通過字典形式賦值,但要注意與數據長度必須相匹配。也可以直接賦值一個Series對象過去,這樣可以在賦值的同時把索引名稱也一并帶過去。

學了NumPy的基礎之后發(fā)現學習pandas基礎會相當輕松,除了多了一個表格型數據外,它的一些核心用法是差不多的,不管是賦值也好還是索引也罷,只要稍加注意一些如讀寫,區(qū)分行列數據的用法就基本掌握了這些知識點了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容