pandas經常使用總結

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}))

鏈接,拼接,可視化,時間日期,

相關文章
相關標籤/搜索