Python科学计算:Pandas
一、Series:一维的序列
1.Series 是个定长的字典序列(就是纵向表示序号和内容)
2.Series有两个基本属性:index 和 values。在 Series 结构中,index 默认是 0,1,2,增的整数序列,
当然我们也可以自己来指定索引,比如 index=[‘a’, ‘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.也可以采用字典的形式进行创建
d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print x3
二、DataFrame:二维的表结构
1.DataFrame 类型数据结构类似数据库表,它包括了行索引和列索引。
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.数据导入和输出:
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx')) #读取数据
score.to_excel('data1.xlsx') #输出数据
print score
3.数据清洗:
3.1 删除DataFrame中不必要的列或者行
@ 使用drop()函数
df2 = df2.drop(columns=['Chinese']) #删除chinses列
df2 = df2.drop(index=['ZhangFei']) #删除zhangfei行
3.2 重命名列名columns,让列表名更容易识别:
@ 使用 rename()函数
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
3.3 去重复值:
@ drop_duplicates()函数
df = df.drop_duplicates() # 去除重复行
4 格式问题:
4.1 更改数据格式:
@ 使用astype()函数来更改格式
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
4.2 数据间的空格
@ 使用strip()删除多余空格
# 删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# 删除左边空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
# 删除右边空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
4.3 大小写转换
@ upper(), lower(), title() 函数
# 全部大写
df2.columns = df2.columns.str.upper()
# 全部小写
df2.columns = df2.columns.str.lower()
# 首字母大写
df2.columns = df2.columns.str.title()
4.4 查找空值
@ 使用 isnull()函数
df.isnull().any() #哪列出现空值
三、使用 apply 函数对数据进行清洗
1.name数列的数值都进行大写转化
df['name'] = df['name'].apply(str.upper)
2.我们也可以定义个函数,在 apply 中进行使用。比如定义double_df 函数是将原来的数值 *2 进行返回。然后
对 df1 中的“语文”列的数值进行 *2 处理,可以写成
def double_df(x):
return 2*x
df1[u'语文'] = df1[u'语文'].apply(double_df)
3.比如对于 DataFrame,我们新增两列,其中’new1’列是“语文”和“英语”成绩之和的 m 倍,'new2’列是“
“语文”和“英语”成绩之和的 n 倍,我们可以这样写:
@ 其中 axis=1 代表按照列为轴进行操作,axis=0 代表按照行为轴进行操作,args 是传递的两个参数,
即 n=2, m=3,在 plus 函数中使用到了 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,))
四、数据统计
1.表格中有一个 describe() 函数,统计函数千千万,describe() 函数最简便
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print df1.describe()
五、数据表合并
@ 创建两个DataFrame
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
1.基于指定列进行连接
df3 = pd.merge(df1, df2, on='name')
2.inner内连接
@ inner 内链接是 merge 合并的默认情况,inner内连接其实也就是键的交集,在这里 df1, df2 相同的
键是 name,所以是基于 name 字段做的连接:
df3 = pd.merge(df1, df2, how='inner')
3.left 左连接
@ 左连接是以第一个 DataFrame 为主进行的连接,第二个DataFrame 作为补充。
df3 = pd.merge(df1, df2, how='left')
4.right 右连接
@ 右连接是以第二个 DataFrame 为主进行的连接,第一个DataFrame 作为补充。
df3 = pd.merge(df1, df2, how='right')
5.outer 外连接
@ 外连接相当于求两个 DataFrame 的并集。
df3 = pd.merge(df1, df2, how='outer')
六、如何用sql方式打开pandas
1.pandasql 中的主要函数是 sqldf,它接收两个参数:一个 SQL 查询语句,还有一组环境变量 globals
() 或 locals()。这样我们就可以在 Python 里,直接用 SQL 语句中对 DataFrame 进行操作,
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)