Python科学计算:Pandas
Series
Series 是个定长的字典序列。定长是因为在存储的时候,相当于两个 ndarray,这也是和字典结构最大的不同。因为在字典的结构里,元素的个数是不固定的。
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) # 运行结果: 0 1 1 2 2 3 3 4 dtype: int64 a 1 b 2 c 3 d 4 dtype: int64
我们也可以采用字典的方式来创建 Series
d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print(x3)
# 运行结果:
a 1
b 2
c 3
d 4
dtype: int64
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)
# 运行结果:
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
数据导入和输出
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print(score)
# 在运行的过程可能会存在缺少 xlrd 和 openpyxl 包的情况
数据清洗
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
1. 删除 DataFrame 中的不必要的列或行
df2 = df2.drop(columns=['Chinese']) # 把“语文”这列删掉 df2 = df2.drop(index=['ZhangFei']) # 把“张飞”这行删掉
2.重命名列名 columns,让列表名更容易识别
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
# 把列名 Chinese 改成 YuWen,English 改成 YingYu。
3.去重复的值
df2.drop_duplicates() # 去除重复行
4.更改数据格式
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
# 把 Chinese 字段的值改成 str 类型,或者 int64
5.数据间的空格
# 先把格式转成 str 类型
# 删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# 删除左边空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
# 删除右边空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
# 删除Chinese 字段里的美元符号
df2['Chinese']=df2['Chinese'].str.strip('$')
6.大小写转换
# 全部大写 df2.columns = df2.columns.str.upper() # 全部小写 df2.columns = df2.columns.str.lower() # 首字母大写 df2.columns = df2.columns.str.title()
7.查找空值
df.isnull() # 哪个地方存在空值 NaN df.isnull().any() # 哪列存在空值NaN
8.apply函数
def double_df(x):
return 2*x
df1[u'语文'] = df1[u'语文'].apply(double_df)
# 定义 double_df 函数是将原来的数值 *2 进行返回,然后对 df1 中的“语文”列的数值进行 *2 处理
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,))
# ’new1’列是“语文”和“英语”成绩之和的 m 倍,'new2’列是“语文”和“英语”成绩之和的 n 倍,
# 其中 axis=1 代表竖轴方向进行操作,axis=0 代表横轴方向进行操作,args 是传递的两个参数,即 n=2, m=3,在 plus 函数中使用到了 n 和 m,从而生成新的 df。
数据统计
Pandas 和 NumPy 一样,都有常用的统计函数,如果遇到空值 NaN,会自动排除。

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 内连接
df3 = pd.merge(df1, df2, how='inner')

3.left左连接
df3 = pd.merge(df1, df2, how='left')

4.right右连接
df3 = pd.merge(df1, df2, how='right')

5.outer外连接
df3 = pd.merge(df1, df2, how='outer')

如何用 SQL 方式打开 Pandas
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)})
sql = "select * from df1 where name ='ZhangFei'"
print(sqldf(sql, globals()))
# 运行结果:
data1 name
0 0 ZhangFei

浙公网安备 33010602011771号