pandas 數據結構簡單理解爲一維,二維,三維數組
#Series (collection of values 亦稱系列) 相似一維ndarray,能夠用numpy部分操做處理(np.sin(),np.max()) #DataFrame (collection of Series objects 亦稱數據幀),結構如有行名和列名的二維矩陣,相似一個表格 #Panel (collection of DataFrame objects 亦稱面板),多個DataFrame的集合,即多張表格數據 pandas Series數據類型 #object - For string values #int - For integer values #float - For float values #datetime - For time values #bool - For Boolean values
pandas.Series( data, index, dtype, copy)。數據結構
1 data 數據採起各類形式,如:ndarray,list,constants 2 index 索引值必須是惟一的和散列的,與數據的長度相同。 默認np.arange(n)若是沒有索引被傳遞。 3 dtype dtype用於數據類型。若是沒有,將推斷數據類型 4 copy 複製數據,默認爲false。 data = np.array(['a','b','c','d']) s = pd.Series(data) data = np.array(['a','b','c','d']) data = {'a' : 0., 'b' : 1., 'c' : 2.} s = pd.Series(data) data = {'a' : 0., 'b' : 1., 'c' : 2.} s = pd.Series(data,index=['b','c','d','a']) -> d NaN s = pd.Series(data,index=[100,101,102,103]) s = pd.Series(5, index=[0, 1, 2, 3]) 索引:s[2],s[1:3],s["a"] 系列基本功能 編號 屬性或方法 描述 1 axes 返回行軸標籤列表。 2 dtype 返回對象的數據類型(dtype)。 3 empty 若是系列爲空,則返回True。 4 ndim 返回底層數據的維數,默認定義:1。 5 size 返回基礎數據中的元素數。 6 values 將系列做爲ndarray返回。 7 head() 返回前n行。 8 tail() 返回最後n行。 from pandas import Series pd.Series([1, 2, 3]).values -> array([1, 2, 3]) original_index = series_custom.index.tolist() sorted_index = sorted(original_index) sorted_by_index = series_custom.reindex(sorted_index) sc2 = series_custom.sort_index() sc3 = series_custom.sort_values() np.add(series_custom, series_custom) #series 對應相加 #data alignment same index,賦予相同的index,而後對應操做 rt_critics = Series(fandango['RottenTomatoes'].values, index=fandango['FILM']) rt_users = Series(fandango['RottenTomatoes_User'].values, index=fandango['FILM']) rt_mean = (rt_critics + rt_users)/2 print(rt_mean)
pandas.DataFrame( data, index, columns, dtype, copy)app
1 data 數據採起各類形式,如:ndarray,series,map,lists,dict,constant和另外一個DataFrame。 2 index 對於行標籤,要用於結果幀的索引是可選缺省值np.arrange(n),若是沒有傳遞索引值。 3 columns 對於列標籤,可選的默認語法是 - np.arange(n)。 這隻有在沒有索引傳遞的狀況下才是這樣。 4 dtype 每列的數據類型。 5 copy 若是默認值爲False,則此命令(或任何它)用於複製數據。 選擇列:print df ['one'] 添加列:df['four']=df['one']+df['three'] ,將兩列的和作新的列 df['new name'] = pd.Series() 刪除列:df.pop('two') 按標籤選擇行:df.loc['b'] 按整數位置選擇行:df.iloc[2] 行切片:df[2:4] 增長新行:df.append(df2) 刪除行:df.drop(0)#標籤重複則刪除多行 DataFrame基本功能 編號 屬性或方法 描述 1 T 轉置行和列。 2 axes 返回一個列,行軸標籤和列軸標籤做爲惟一的成員。 3 dtypes 返回此對象中的數據類型(dtypes)。 4 empty 若是NDFrame徹底爲空[無項目],則返回爲True; 若是任何軸的長度爲0。 5 ndim 軸/數組維度大小。 6 shape 返回表示DataFrame的維度的元組。 7 size NDFrame中的元素數。 8 values NDFrame的Numpy表示。 9 head() 返回開頭前n行。 10 tail() 返回最後n行。
面板:pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)dom
data 數據採起各類形式,如:ndarray,series,map,lists,dict,constant和另外一個數據幀(DataFrame) items axis=0 major_axis axis=1 minor_axis axis=2 dtype 每列的數據類型 copy 複製數據,默認 - false 初始化:3Dndarray: data = np.random.rand(2,4,5) p = pd.Panel(data) DataFrame: data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)), 'Item2' : pd.DataFrame(np.random.randn(4, 2))} p = pd.Panel(data) 索引: p['Item1'] p.major_xs(1) p.minor_xs(1)
下面重點是Dataframe的介紹:函數
導入ui
import pandas food_info = pandas.read_csv("food_info.csv") print(type(food_info)) -> <class 'pandas.core.frame.DataFrame'> pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None) #index_col 指定某列做爲索引,names指定列名,skiprows跳過指定行數 pd.read_excel
初始化this
#初始化 data = [1,2,3,4,5] df = pd.DataFrame(data) data = [['Alex',10],['Bob',12],['Clarke',13]] df = pd.DataFrame(data,columns=['Name','Age'],dtype=float) data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]} df = pd.DataFrame(data) data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]} df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4']) data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] df = pd.DataFrame(data) #沒有的爲NaN data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] df = pd.DataFrame(data, index=['first', 'second']) data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b']) d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d)
索引以及行列操做編碼
.loc() 基於標籤、單個標量標籤、標籤列表、切片對象、一個布爾數組 df.loc[:,'A'] df.loc[:,['A','C']] df.loc['a':'h'] .iloc() 基於整數、整數列表、系列值 df.iloc[:4] df.iloc[1:5, 2:4] df.iloc[[1, 3, 5], [1, 3]] .ix() 基於標籤和整數 df.ix[:4] df.ix[:,'A'] 屬性. df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) print (df.A) #pandas從0開始索引 print food_info.loc[0] #第一行 food_info.loc[6] #第七行,超出範圍會報錯 # DataFrame 的3,4,5,6行,注意:左閉右閉 print food_info.loc[3:6] two_five_ten = [2,5,10] print food_info.loc[two_five_ten] #2,5,10行 print food_info.loc[[2,5,10]] #同上 ndb_col = food_info["NDB_No"] #指定列 col_name = "NDB_No" ndb_col = food_info[col_name] columns = ["Zinc_(mg)", "Copper_(mg)"] zinc_copper = food_info[columns] zinc_copper = food_info[["Zinc_(mg)", "Copper_(mg)"]] food_info.columns #顯示列名,可是不是list -> Index([u'NDB_No', u'Shrt_Desc'],dtype='object') col_names = food_info.columns.tolist() #將列名轉爲list -> ['NDB_No', 'Shrt_Desc',] div_1000 = food_info["Iron_(mg)"] / 1000 #對該列每行數據除以1000(能夠實現+-*/,返回是series) water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"] #列與列之間運算 max_calories = food_info["Energ_Kcal"].max() #某列中的最大值 gram_columns = [] print type(col_names) for c in col_names: if c.endswith("(g)"): gram_columns.append(c) gram_df = food_info[gram_columns] print(gram_df.head(3)) DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') axis:{0 or ‘index’, 1 or ‘columns’}, default 0,默認按照索引排序,即縱向排序,若是爲1,則是橫向排序 by:str or list of str;若是axis=0,那麼by="列名";若是axis=1,那麼by="行名"; ascending:布爾型,True則升序,能夠是[True,False],即第一字段升序,第二個降序 inplace:布爾型,是否用排序後的數據框替換現有的數據框 kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。 na_position : {‘first’, ‘last’}, default ‘last’,默認缺失值排在最後面 example: 沿着軸方向按指定值排序 x.sort_values(by="x1",ascending= False)
是否爲NaN.net
age = titanic_survival["Age"] #某列 age_is_null = pd.isnull(age) #返回該列是不是NaN的bool值 age_null_true = age[age_is_null] #返回是True所在行,可是值是NaN age_null_count = len(age_null_true) #統計非空數量 mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"]) #爲NaN,則該列含有NaN,含NaN的運算可能致使結果爲NaN good_ages = titanic_survival["Age"][age_is_null == False] #與前面結合,將NaN值踢掉 titanic_survival["Age"].mean() #則是自動剔除NaN計算
計算每一個班的平均分excel
passenger_classes = [1, 2, 3] fares_by_class = {} for this_class in passenger_classes: pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class] pclass_fares = pclass_rows["score"] fare_for_class = pclass_fares.mean() fares_by_class[this_class] = fare_for_class
數據透視表(剛接觸的比較難理解)
pandas.pivot_table() data:DataFrame對象 values:源數據中的一列,數據透視表中用於觀察分析的數據值,相似Excel中的值字段 index:源數據中的一列,數據透視表用於行索引的數據值,相似Excel中的行字段 columns:源數據中的一列,數據透視表用於列索引的數據值,相似Excel中列字段 aggfunc:根據當前的行、列索引生成的數據透視表中有多個數據須要進行聚合時,對這多個數據須要進行的操做,默認爲np.mean()
pandas.DataFrame.dropna
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) 功能:根據各標籤的值中是否存在缺失數據對軸標籤進行過濾,可經過閾值調節對缺失值的容忍度 參數:axis : {0 or ‘index’, 1 or ‘columns’},或 tuple/list how : {‘any’, ‘all’} any : 若是存在任何NA值,則放棄該標籤 all : 若是因此的值NA值,則放棄該標籤 thresh : int, 默認值 None int value :要求每排至少N個非NA值 subset : 相似數組,列名 ["Age", "Sex"] inplace : boolean, 默認值 False 若是爲True,則進行操做並返回None。 返回:被刪除的DataFrame titanic_survival.loc[1,"Age"] #索引,第2行,"Age"列的值,選擇多行返回dataframe,選擇單行返回Series df1 = df.loc[[0,2,3],:] df2 = df1.reset_index() #df1按順序加上新的索引,原來的索引列名爲"index" reset_index,經過函數 drop=True 刪除原行索引 df3 = df1.reset_index(drop=True)
默認狀況下會以列爲單位,分別對列應用函數,將df按行或列傳給函數f處理,函數須要返回值
t1=df.apply(f) t2=df.apply(f,axis=1) def which_class(row): pclass = row['Pclass'] if pd.isnull(pclass): return "Unknown" elif pclass == 1: return "First Class" elif pclass == 2: return "Second Class" elif pclass == 3: return "Third Class" classes = titanic_survival.apply(which_class, axis=1)
重置索引
DataFrame能夠經過set_index方法,能夠設置單索引和複合索引。 DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) append添加新索引,drop爲False,inplace爲True時,索引將會還原爲列] data: a b c d 0 bar one z 1.0 1 bar two y 2.0 2 foo one x 3.0 3 foo two w 4.0 indexed1 = data.set_index('c') a b d c z bar one 1.0 y bar two 2.0 x foo one 3.0 w foo two 4.0 indexed2 = data.set_index(['a', 'b']) c d a b bar one z 1.0 two y 2.0 foo one x 3.0 two w 4.0
groupby:
group1 = df.groupby('key1') group2 = df.groupby(['key1','key2']) group1.size()/sum()/count() #分組統計 對於分組的某一列或者多個列,應用agg(func)能夠對分組後的數據應用func函數 group1['data1'].agg('mean') group1['data1'].agg(['mean','sum']) group1['data1','data2'].agg(['mean','sum']) apply()不一樣於agg()的地方在於:前者應用於dataframe的各個列,後者僅做用於指定的列。 交叉表crosstab 能夠按照指定的行和列統計分組頻數 pd.crosstab(df.key1,df.key2, margins=True)
經常使用函數
print food_info.dtypes (返回各個列的數據類型) NDB_No int64 Shrt_Desc object Water_(g) float64 Energ_Kcal int64 first_rows = food_info.head() #默認5行 print first_rows print(food_info.head(3)) #print food_info.columns print food_info.shape #不包括第一行head行
重要函數 -
編號 函數 描述 1 count() 非空觀測數量 2 sum() 全部值之和 3 mean() 全部值的平均值 4 median() 全部值的中位數 5 mode() 值的模值 6 std() 值的標準誤差 7 min() 全部值中的最小值 8 max() 全部值中的最大值 9 abs() 絕對值 10 prod() 數組元素的乘積 11 cumsum() 累計總和 12 cumprod() 累計乘積 注 - 因爲DataFrame是異構數據結構。通用操做不適用於全部函數。 相似於:sum(),cumsum()函數能與數字和字符(或)字符串數據元素一塊兒工做,不會產生任何錯誤。字符聚合歷來都比較少被使用,雖然這些函數不會引起任何異常。 因爲這樣的操做沒法執行,所以,當DataFrame包含字符或字符串數據時,像abs(),cumprod()這樣的函數會拋出異常。 代表智函數應用:pipe() 行或列函數應用:apply() 元素函數應用:applymap()
遍歷DataFrame:
要遍歷數據幀(DataFrame)中的行,可使用如下函數 - iteritems() - 迭代(key,value)對 iterrows() - 將行迭代爲(索引,系列)對 itertuples() - 以namedtuples的形式迭代行 for col in df: print (col)#列名 for key,value in df.iteritems(): print (key,value) #列爲鍵 for row_index,row in df.iterrows(): print (row_index,row)#行爲鍵 for row in df.itertuples(): print (row) #每行一個元組(index,行值)
排序:
sorted_df=unsorted_df.sort_index(axis=1) 按行or列排序(按index或者列名) sorted_df = unsorted_df.sort_values(by='col1') #按值排序,某列的值
pandas 對字符串操做函數
1 lower() 將Series/Index中的字符串轉換爲小寫。 2 upper() 將Series/Index中的字符串轉換爲大寫。 3 len() 計算字符串長度。 4 strip() 幫助從兩側的系列/索引中的每一個字符串中刪除空格(包括換行符)。 5 split(' ') 用給定的模式拆分每一個字符串。 6 cat(sep=' ') 使用給定的分隔符鏈接系列/索引元素。 7 get_dummies() 返回具備單熱編碼值的數據幀(DataFrame)。 8 contains(pattern) 若是元素中包含子字符串,則返回每一個元素的布爾值True,不然爲False。 9 replace(a,b) 將值a替換爲值b。 10 repeat(value) 重複每一個元素指定的次數。 11 count(pattern) 返回模式中每一個元素的出現總數。 12 startswith(pattern) 若是系列/索引中的元素以模式開始,則返回true。 13 endswith(pattern) 若是系列/索引中的元素以模式結束,則返回true。 14 find(pattern) 返回模式第一次出現的位置。 15 findall(pattern) 返回模式的全部出現的列表。 16 swapcase 變換字母大小寫。 17 islower() 檢查系列/索引中每一個字符串中的全部字符是否小寫,返回布爾值 18 isupper() 檢查系列/索引中每一個字符串中的全部字符是否大寫,返回布爾值 19 isnumeric() 檢查系列/索引中每一個字符串中的全部字符是否爲數字,返回布爾值。 s = pd.Series(['Tom', 'William Rick', 'John', 'Alber[@t](https://my.oschina.net/u/104868)', np.nan, '1234','SteveMinsu']) print (s.str.lower()) s = pd.Series(['Tom', 'William Rick', 'John', 'Alber[@t](https://my.oschina.net/u/104868)', np.nan, '1234','SteveMinsu']) print (s.str.len())
pct_change()函數
系列,DatFrames和Panel都有pct_change()函數。此函數將每一個元素與其前一個元素進行比較,並計算變化百分比。 協方差 協方差適用於系列數據。Series對象有一個方法cov用來計算序列對象之間的協方差。NA將被自動排除。 s1 = pd.Series(np.random.randn(10)) s2 = pd.Series(np.random.randn(10)) print (s1.cov(s2)) print (frame['a'].cov(frame['b'])) print (frame.cov())
相關性
相關性顯示了任何兩個數值(系列)之間的線性關係。有多種方法來計算pearson(默認),spearman和kendall之間的相關性。 (frame['a'].corr(frame['b'])) print (frame.corr()) 排名s.rank() Rank可選地使用一個默認爲true的升序參數; 當錯誤時,數據被反向排序,也就是較大的值被分配較小的排序。 Rank支持不一樣的tie-breaking方法,用方法參數指定 - average - 並列組平均排序等級 min - 組中最低的排序等級 max - 組中最高的排序等級 first - 按照它們出如今數組中的順序分配隊列
清理/填充缺乏數據
Pandas提供了各類方法來清除缺失的值。fillna()函數能夠經過幾種方法用非空數據「填充」NA值 df.fillna(0) pad/fill 填充方法向前 bfill/backfill 填充方法向後 丟失缺乏的值 若是隻想排除缺乏的值,則使用dropna函數和axis參數。 默認狀況下,axis = 0,即在行上應用,這意味着若是行內的任何值是NA,那麼整個行被排除。 替換丟失(或)通用值 不少時候,必須用一些具體的值取代一個通用的值。能夠經過應用替換方法來實現這一點。 用標量值替換NA是fillna()函數的等效行爲 df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]}) print (df.replace({1000:10,2000:60}))
鏈接,拼接,可視化,時間日期,