DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾值等)。
DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個索引)。跟他類似的數據結構相比,DataFrame面向行和列的操作基本上是平衡的。
DataFrame中的數據是以一個或多個二維塊存放的(并不像列表、字典或別的一維數據結構)。
1.png
從結果可以看出,DataFrame會自動加上索引(跟Series一樣),且全部列會被有序排列。
如果指定了列序列,則DataFrame的列會按照指定順序進行排列:
2.png
DataFrame跟Series一樣,如果傳入的列在數據中找不到,就會產生NA值:
3.png
4.png
從上面的例子可以看出,返回的Series擁有原DataFrame相同的索引,且name屬性也被相應地設置好。
5.png
6.png
7.png
將列表或數組賦值給某個列時,其長度必須跟DataFrame的長度相匹配。如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值NaN:
8.png
為不存在的列賦值會創建出一個新列。關鍵字del用于刪除列:
9.png
注意:Series會直接修改源DataFrame上的數據。
另一種數據形式:嵌套字典(字典的字典)
1.png
內層字典的鍵會被合并、排序以形成最終的索引。如果顯式指定索引,則按指定的排序:
2.png
由Series組成的字典:
3.png
下面列出了DataFrame構造函數所能接受的各種數據:
4.png
設置DataFrame的index和columns的name屬性:
5.png
設置values屬性,以二維ndarray的形式返回DataFrame中的數據:
6.png
如果DataFrame各列的數據類型不同,則值數組的數據類型會選用能兼容所有列的數據類型:
7.png
索引對象
pandas的索引對象負責管理軸標簽和其他元素數據(比如軸名稱等)。構建Series或DataFrame時,所用到的任何數組或其他序列的標簽都會轉換成一個Index:
1.png
Index對象是不可修改:
2.png
Index對象是不可修改才能保證Index對象在多個數據結構之間安全共享:
3.png
Index的功能類似一個固定大小的集合:
4.png
下面列出了Index的方法和屬性:
5.png
# coding: utf-8
# In[1]:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 構建DataFrame
data = {'province':['Guangdong','Shandong','Henan','Guangdong','Shandong','Henan'],
'year':[2016,2016,2016,2013,2013,2013],
'pop':[10999,9946.64,9532.42,10644,9733,9413]}
frame = DataFrame(data)
print (frame)
# In[2]:
# 指定列序列
fr = DataFrame(data,columns=['year','province','pop'])
print(fr)
# In[3]:
frame2 = DataFrame(data,columns=['year','province','pop','growth rate'],
index=['one','two','three','four','five','six'])
print(frame2)
# In[4]:
print(frame2.columns)
# In[5]:
print(frame2['province'])
# In[6]:
print(frame.year)
# In[7]:
# ix獲取行內容
ro = frame2.ix['three']
print(ro)
# In[8]:
# .loc(基于標簽的索引)
print(frame2.loc[['three']])
# In[9]:
# .iloc(位置索引)
A = frame2.iloc[[2,4],frame2.columns.get_indexer(['province','pop'])]
print(A)
# In[10]:
# 通過賦值的方式修改列
frame2['growth rate'] = '--'
print (frame2)
# In[11]:
frame2['growth rate'] = '%20'
print (frame2)
# In[12]:
frame2['growth rate'] = np.arange(6)
print (frame2)
# In[13]:
# 賦值一個Series
val = Series([4,3,2],index=['two','four','six'])
frame2['growth rate'] = val
print(frame2)
# In[14]:
# 為不存在的列賦值
frame2['north'] = frame2.province == 'Shandong'
print(frame2)
# In[15]:
# 使用關鍵字del刪除列
del frame2['north']
print(frame2)
# In[16]:
# 嵌套字典
pop = {'Guangdong':{2016:10999,2013:10644},
'Shandong':{2016:9946.64,2015:9847.2,2013:9733}}
frame3 = DataFrame(pop)
print (frame3)
# In[17]:
# 對結果轉置
print(frame3.T)
# In[18]:
# 指定索引
f = DataFrame(pop,index=[2016,2013,2010])
print(f)
# In[19]:
print(frame3)
# In[20]:
# 由Series組成的字典
pdata = {'Guangdong':frame3['Guangdong'][1:],
'Shandong':frame3['Shandong'][1:3]}
d = DataFrame(pdata)
print(d)
# In[21]:
# 設置DataFrame的index和columns的name屬性
frame3.index.name = 'year';frame3.columns.name = 'province'
print(frame3)
# In[22]:
# 設置values屬性
print(frame3.values)
# In[23]:
print(frame2)
# In[24]:
print(frame2.values)
# In[25]:
# 索引對象
obj = Series(range(3),index=['a','b','c'])
index = obj.index
print(index)
# In[26]:
inre = index[1:]
print(inre)
# In[27]:
# Index對象是不可修改:
index[1] = 'd'
# In[28]:
index = pd.Index(np.arange(3))
print(index)
# In[29]:
obj2 = Series([1.5,-2.5,0],index = index)
print(obj2)
# In[30]:
obj2.index is index
# In[31]:
print(frame3)
# In[32]:
'Guangdong' in frame3.columns
# In[33]:
2012 in frame3.index