Python科學(xué)計(jì)算:Pandas
一概页、Series:一維的序列
1.Series 是個(gè)定長的字典序列(就是縱向表示序號和內(nèi)容)
2.Series有兩個(gè)基本屬性:index 和 values嫡锌。在 Series 結(jié)構(gòu)中凌受,index 默認(rèn)是 0,1,2,增的整數(shù)序列虱痕,
當(dāng)然我們也可以自己來指定索引齿桃,比如 index=[‘a(chǎn)’, ‘b’, ‘c’, ‘d’]惠窄。
import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print x1
print x2
3.也可以采用字典的形式進(jìn)行創(chuàng)建
d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print x3
二谅辣、DataFrame:二維的表結(jié)構(gòu)
1.DataFrame 類型數(shù)據(jù)結(jié)構(gòu)類似數(shù)據(jù)庫表,它包括了行索引和列索引。
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'+'
'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'],'+'
columns=['English', 'Math', 'Chinese'])
print df1
print df2
2.數(shù)據(jù)導(dǎo)入和輸出:
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx')) #讀取數(shù)據(jù)
score.to_excel('data1.xlsx') #輸出數(shù)據(jù)
print score
3.數(shù)據(jù)清洗:
3.1 刪除DataFrame中不必要的列或者行
@ 使用drop()函數(shù)
df2 = df2.drop(columns=['Chinese']) #刪除chinses列
df2 = df2.drop(index=['ZhangFei']) #刪除zhangfei行
3.2 重命名列名columns前翎,讓列表名更容易識別:
@ 使用 rename()函數(shù)
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
3.3 去重復(fù)值:
@ drop_duplicates()函數(shù)
df = df.drop_duplicates() # 去除重復(fù)行
4 格式問題:
4.1 更改數(shù)據(jù)格式:
@ 使用astype()函數(shù)來更改格式
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
4.2 數(shù)據(jù)間的空格
@ 使用strip()刪除多余空格
# 刪除左右兩邊空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# 刪除左邊空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
# 刪除右邊空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
4.3 大小寫轉(zhuǎn)換
@ upper(), lower(), title() 函數(shù)
# 全部大寫
df2.columns = df2.columns.str.upper()
# 全部小寫
df2.columns = df2.columns.str.lower()
# 首字母大寫
df2.columns = df2.columns.str.title()
4.4 查找空值
@ 使用 isnull()函數(shù)
df.isnull().any() #哪列出現(xiàn)空值
三稚配、使用 apply 函數(shù)對數(shù)據(jù)進(jìn)行清洗
1.name數(shù)列的數(shù)值都進(jìn)行大寫轉(zhuǎn)化
df['name'] = df['name'].apply(str.upper)
2.我們也可以定義個(gè)函數(shù),在 apply 中進(jìn)行使用鱼填。比如定義double_df 函數(shù)是將原來的數(shù)值 *2 進(jìn)行返回。然后
對 df1 中的“語文”列的數(shù)值進(jìn)行 *2 處理毅戈,可以寫成
def double_df(x):
? ? ? ? ? return 2*x
df1[u'語文'] = df1[u'語文'].apply(double_df)
3.比如對于 DataFrame苹丸,我們新增兩列,其中’new1’列是“語文”和“英語”成績之和的 m 倍苇经,'new2’列是“
“語文”和“英語”成績之和的 n 倍赘理,我們可以這樣寫:
@ 其中 axis=1 代表按照列為軸進(jìn)行操作,axis=0 代表按照行為軸進(jìn)行操作扇单,args 是傳遞的兩個(gè)參數(shù)商模,
即 n=2, m=3,在 plus 函數(shù)中使用到了 n 和 m蜘澜,從而生成新的df.
def plus(df,n,m):
? ? df['new1'] = (df[u'語文']+df[u'英語']) * m
? ? df['new2'] = (df[u'語文']+df[u'英語']) * n
? ? return df
df1 = df1.apply(plus,axis=1,args=(2,3,))
四施流、數(shù)據(jù)統(tǒng)計(jì)
1.表格中有一個(gè) describe() 函數(shù),統(tǒng)計(jì)函數(shù)千千萬鄙信,describe() 函數(shù)最簡便
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print df1.describe()
五瞪醋、數(shù)據(jù)表合并
@ 創(chuàng)建兩個(gè)DataFrame
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
1.基于指定列進(jìn)行連接
df3 = pd.merge(df1, df2, on='name')
2.inner內(nèi)連接
@ inner 內(nèi)鏈接是 merge 合并的默認(rèn)情況,inner內(nèi)連接其實(shí)也就是鍵的交集装诡,在這里 df1, df2 相同的
鍵是 name银受,所以是基于 name 字段做的連接:
df3 = pd.merge(df1, df2, how='inner')
3.left 左連接
@ 左連接是以第一個(gè) DataFrame 為主進(jìn)行的連接践盼,第二個(gè)DataFrame 作為補(bǔ)充。
df3 = pd.merge(df1, df2, how='left')
4.right 右連接
@ 右連接是以第二個(gè) DataFrame 為主進(jìn)行的連接宾巍,第一個(gè)DataFrame 作為補(bǔ)充咕幻。
df3 = pd.merge(df1, df2, how='right')
5.outer 外連接
@ 外連接相當(dāng)于求兩個(gè) DataFrame 的并集。
df3 = pd.merge(df1, df2, how='outer')
六顶霞、如何用sql方式打開pandas
1.pandasql 中的主要函數(shù)是 sqldf肄程,它接收兩個(gè)參數(shù):一個(gè) SQL 查詢語句,還有一組環(huán)境變量 globals
() 或 locals()确丢。這樣我們就可以在 Python 里绷耍,直接用 SQL 語句中對 DataFrame 進(jìn)行操作,
import pandas as pd
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
print pysqldf(sql)