DataFrame
DataFrame 概念和創建 :
先來看一個例子 :
這是一個由列表組成的字典
import numpy as np import pandas as pd data = {'name':['Jack','Tom','Mary'],'age':[18,19,21],'gender':['m','m','w']} frame = pd.DataFrame(data) print(frame)

可以看到 DataFrame 可以理解是一個二維數組,是一個表格型的數據結構,它包含了有序的列.
print(frame.index) # 取列,標簽,索引 print(frame.columns) # 取行
也可以使用Values 取得該DataFrame的值 :
print(frame.values , type(frame.values))

查看該frame的屬性,可以看到該frame還是一個數組,接下來看看DataFrame的創建方式
還可以指定DataFrame的列 和 行,使用cloumns屬性和 index 屬性 list類型參數,(如果設置的該列不存在,就用NaN填充) :
frame = pd.DataFrame(data,index=['Jack','Tom','Mary'],columns=['age','name','gender','height'])
需要注意的是 指定index 重新定義索引,格式是list ,長度需要一致.否則報錯!
方法二 : 由 Series組成的字典 :
data1 = {'one':pd.Series(np.random.rand(2)),'two':pd.Series(np.random.rand(3))} #沒有設置index的Series data2 = {'one':pd.Series(np.random.rand(2),index=['a','b']),'two':pd.Series(np.random.rand(3),index=['a','b','c'])} #設置了indes9Series print (data2) df1 = pd.DataFrame (data1) df2 = pd.DataFrame (data2)
與上面的方法一相比,Series 可以長度不一樣,對於沒有的值,DataFrame會用NaN填充.
由Series 組成的字典, 創建DataFrame時, columns為字典的key,index為Series 的標簽,就是索引.如果Series沒有指定標簽,那就默認用數字標簽.
方法三 : 通過 二維數組 直接創建
arr = pd.DataFrame(np.random.rand(9).reshape(3,3))
可以看到,由於沒設置 行和列 , 所以默認用數字標簽. 這樣不美觀,不便於編碼,所以我們可以手動添加columns和index
arr1 = pd.DataFrame(np.random.rand(9).reshape(3,3),index=['a','b','c'],columns=['one','two','three'])
通過 二維數組 直接創建DataFrame,得到一個形狀的結果數據.如果不指定index 和 columns,兩者均返回默認的數字格式.
?? 嘗試一下index 或columns 長度不等於已有數據的情況 ??
arr1 = pd.DataFrame(np.random.rand(9).reshape(3,3),index=['a','b','c','d'],columns=['one','two','three']) #index中的d
報錯了, 所以index 和columns的長度必須與原數據保持一致!
方法四 : 由 字典組成的列表
data = [{'one':1,'two':2},{'one':5,'two':10,'three':20}] arr= pd.DataFrame(data)
由 字典組成的列表創建DataFrame, columns為字典的key ,index 不做指定則默認為數據標簽.
如果設置index 那么標簽/索引就是 指定的 :
arr= pd.DataFrame(data,index=['a','b'])
如果只設置了行 那么 就只創建指定的行
arr= pd.DataFrame(data,columns=['one','two'])
# columns 和 index 參數分別重新指定相應列 及行 標簽 以上#
方法五 : 由 字典組成的字典
data = { 'Jack':{ 'math':90,'english':89,'art':78 }, 'Marry':{ 'math':82,'english':95,'art':92 }, 'Tom':{ 'math':78,'english':67 } } df = pd.DataFrame(data)
# 可以看到 由字典組成的字典創建DataFrame ,columns為字典的key , index 就是子字典的key.
另外 : columns參數可以增加和減少現有的列 ,如果出現新的列,會用NaN值進行填充 ,如下 :
df = pd.DataFrame(data , columns=['Jack','Marry','Tom'])
另外 Index正在這里可之前不同, 不能改變原有的 index ,如果指定為新的標簽 ,值就會變成NaN ,因為它匹配不到指定的標簽(非常重要) ,如圖 :
df = pd.DataFrame(data , index=['a','b','c'])
### 以上就是DataFrame的幾種創建方法 . . . . . .
DataFrame 索引 :
1. 如何選擇 行 和 列 :
df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=['one','two','three'],columns=list('abcd'))
選擇一列 或者 多列 :
df['a'] #單列 df[['a','c']] #多列
DataFrame是一個包含多個Series的數組, 所以 返回的單列 是一個 Series . 返回多列 則是一個DataFrame.
單獨選列 整數參數可以選擇行,但是不能單獨選 必須以冒號來選 ,利用切片的方式 !
行 - loc : 按index 選擇行
df.loc['two']
當我們指定index 只能使用索引標簽, 未指定index 才能使用數字索引 . 返回的單行 和 多行,同上,Series 和DataFrame類型
如果選擇 不存在 的行 ,Pycharm 會報錯 , 而Jupyter 則會用NaN填充!
標簽不同 切片方式也不相同 :
df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=['one','two','three'],columns=list('abcd')) df1 = pd.DataFrame(np.random.rand(12).reshape(3,4),columns=list('abcd')) print(df.loc['two':'three']) print(df1.loc[1:2])
DataFrame 使用整數做索引,index是可變的,所以整數成了標簽,string 而不是數字. 標簽切片 ,閉區間
DataFrame.loc[ label ] 主要是針對 行 索引 ,同時指出指定index 以及默認index
DataFrame .iloc[ ] 按照參數位置(從0到length-1) 選擇行,類似於 list 的索引,順序是DataFrame的整數位置,從0開始
df.iloc[0] #取一行
df.iloc[[0,1]] #選擇多行
df.iloc[[1,0]] #位置變換去行
運行之后,從結果可以看出,正常索引沒有問題,選擇多行, 索引順序可變,python會自動去配對相應的行索引. 同時索引時,不能超出索引的范圍
如果忘了 函數的使用 可以用全局函數 help(參) 接口來查看相應的使用方式及詳細說明
布爾型索引 -- 原理上 和Series 原理相同,看代碼 :
df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=list('one','two','three'),columns=list('a','b','c','d')) * 100
b1 = df <50 # 返回一個和df形狀相同的布爾型的dataframe df[b1] #返回一個dataframe,所有數據,True返回原數據,False 返回NaN
還可以對單列進行判斷 :
b2 = df['a']>30 print(df['a'][b2])
# 單列就是一個Series ,索引時,保留判斷為True的列數據和行. 范湖的是一個Series .
還可以多行,多列判斷 :
b3 = df[['a','b']]>30 print(df[b3])
多行多列 返回形狀相同的dataframe ,為True的返回原數據,False返回NaN 值.
多重索引 同時索引行和列
#多重索引的幾種方式 df['a'].loc[['one','three']] #從A列索引one ,three 兩行數據 df[['b','c','d']].iloc[::2] # 從b,c,d3列索引,每隔2個索引一條 df[df['a']<50].iloc[0] #索引A列小於50的第一個值
索引的方式多種多樣 , 多嘗試多探索. 索引的基本方式就是這樣了
DataFrame 基本操作 :
df = DataFrame(np.random.rand(10000).reshape(100,100))
前 head() 尾 tail() :
df.head(2) # 查看前 2行 df.tail(3) #查看尾 3行 默認查看5行
數據轉置 :
dfs = DataFrame(np.random.rand(4).reshape(2,2))
dfs
dfs.T
添加和修改 :
添加 index 和 添加columns :
dfs.index =['one','two'] dfs.columns=list('ab')
添加列 及 指定 值 :
dfs['c'] =88
修改 列 及多列 :
dfs['c'] =20 dfs[['a','b']] = 33
添加 行 :
dfs.loc['c'] =6 #添加行 c 並指定值為6
① 刪除 列 :
del dfs['a']
② 列刪除方法 drop :
dfs.drop('one') # 按索引刪除 數字,字符串 類型 默認返回刪除后的DataFrame 不修改原數據
drop 有個默認參數 'axis' , 默認為0, 刪除行. 設置為1 刪除列
dfs.drop('b',axis=1)
# drop 默認返回一個數據類型, 設置inplace為True時,不返回值,會修改原數據
dfs.drop('b',axis=1,inplace=True) print(dfs)
對齊 將兩個DataFrame相加時:
df1 = DataFrame(np.arange(9).reshape(3,3),columns=list('abc')) df2 = DataFrame(np.arange(4).reshape(2,2),columns=list('ab')) print(df1+df2)
DataFrame相加時 按照行和列 對齊相加,如果不存在的行和列 則和NaN相加 ,NaN和任何值相加都為NaN
排序功能 :
對行 或者 列 進行排序 :
df = DataFrame(np.random.randint(16,size=[4,4]),columns=list('abcd')) print(df) #原數據
按值 排序 :
df.sort_values('d')
👆 : 按照列標簽等於指定 列 的值進行排序 , 默認從小到大, 參數 ascending 默認為True 升序,False就降序
👆 :默認 axis=0 用列的值對行進行排序,設置 1 則對行的值對列進行排序。所以第一個參數需要傳入列索引
df.sort_values(2,axis=1)
按 索引排序 :
df.index= [5,3,1,2]
df.sort_index()
👆 :默認按索引進行升序,ascending=False 降序 ,如果要對列排序 將axis參數設置為 1 即可。(行首和列首只有一行,所以不需要填索引)
👆 :sort_values , sort_index 都有一個 inplace 的參數,作用與上面的API一致(設置為True 時,修改原數據不返回對象,否則返回新的對象.)