目录
一、从外部文件读取/写入数据
以下所有读取或写入的数据统一以 Pandas 下的 DataFrame 类来承载。需要注意的是,使用 Pandas 模块读取.csv文件,为了防止因为读取路径包含中文字符而报错,需要注明使用 Python 作为加载引擎。
import os
import pandas as pd
import json
# 路径
__file__ #运行文件路径
os.listdir(path) #列示文件夹下所有文件名
os.path.exists(path) #判断路径指向目标是否存在
os.path.isdir(path) #判断路径是否指向文件夹
os.path.isfile(path) #判断路径是否指向文件
os.path.dirname() #截取上一级文件夹路径
os.mkdir(path) #新建文件夹
os.rmdir(path) #删除文件夹
# .txt/.csv
df = pd.read_csv(path, sep=',', engine='python') #读取
df.to_csv(path, sep=',', index=None) #写入
# .xls/.xlsx
df = pd.read_excel(path) #读取
df.to_excel(path, index=None) #写入
# .json
d = json.load(open(path,encoding='utf-8')) #读取
json.dump(d,open(path,'w',encoding='utf-8')) #写入
二、数据清洗
数据清洗用于纠正数据错误,包含格式检查、空值填补和异常值剔除等。数据的载体决定了数据清洗的效率。以下是数据处理中主要使用的类及其对比:
类 | list | array | Series | DataFrame |
---|---|---|---|---|
模块 | - | Numpy | Pandas | Pandas |
最高嵌套维度 | 无限 | 无限 | 一维 | 二维 |
优点 | 系统内置类,调用简单,运行速度快;对维度一致性没有严格要求 | 擅长处理多维矩阵;可迅速生成特殊矩阵;数学/统计学运算可用于其他多个类型的变量 | - | 内置高效的数据清洗函数 |
缺点 | 针对数值的数学/统计学操作必须通过遍历每一项进行,代码效率低 | 维度一致性要求严格;没有高效的数据清洗函数 | - | 仅限二维;数学/统计学运算仅能用于 DataFrame 类的变量 |
用途 | 用于处理引用关系和简单数据 | 用于多维数据的处理以及数学运算 | 与 DataFrame 搭配使用 | 用于数据清洗、统计学运算和数据存储 |
导入所需模块,及本章示范所用的变量:
import numpy as np
import pandas as pd
string = 'This is an example.'
vector = [1,2,3,4,5,6]
vector2 = [5,2,1,4,3,6]
matrix = [[1,2,3],[4,5,6]]
cube = [[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]]]
l = list(vector)
arr = np.array(matrix)
arr2 = np.array(cube)
arr3 = np.array(vector)
arr4 = np.array(vector2)
arr5 = np.array([[[[2],[3]],[[4],[5]]]])
s = pd.Series(['Tom', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
s1 = pd.Series([1,5,2,3,6,7])
s2 = pd.Series([9,7,3,1,6,3])
df = pd.DataFrame(matrix)
df2 = pd.DataFrame(np.random.random((5,3)), index=['a','c','e','f','h'], columns=['one','two','three'])
df3 = df2.reindex(index=['a','b'],columns=['one','two','five'])
df4 = pd.DataFrame({
'Team':['Liverpool','Liverpool','Chelsea','Chelsea','Barcelona','Barcelona','Barcelona','Barcelona','Liverpool','Man U','Man U','Liverpool'],'Rank': [1,2,2,3,3,4,1,1,2,4,1,2],'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],'Points': [876,789,863,673,741,812,756,788,694,701,804,690]})
bins = [500,600,700,800,900]
labels = ['500-599','600-699','700-799','800-899']
df_one = pd.DataFrame({
'id':[1,2,3,4], 'Name': ['Li', 'Yi', 'Qu', 'Mi'], 'subject_id':['DM','ML','DB','Prog.']})
df_two = pd.DataFrame({
'id':[1,2,3,4], 'Name': ['Amy', 'Biky', 'Charles', 'Dave'], 'subject_id':['AI','ML','DB','NN']})
df_three = pd.DataFrame({
'id2':[1,2,3,4], 'Name2': ['Amy', 'Biky', 'Charles', 'Dave'], 'subject_id2':['AI','ML','DB','NN']})
除了 Pandas 模块下的 Series 类对数据类型格式要求较为严格,其他的类都可以通过间接的方式实现相互转换。例如,将 DataFrame 格式的数据转换为 list,可以先将其转换为 Numpy 模块下的 array 格式,然后调用 Numpy 的 tolist() 公式。以下是两种常用的无差别转换:
l = arr.tolist() #np.array转换为list
arr = df.values #pd.DataFrame转换为np.array
1) 基本代码
以下列示不同种类的变量常用操作。
Built-In:str 类
string.find('is',4) #寻找字符串
string.index('is',4) #寻找字符串
string.count('a') #出现频率
string.replace(‘a’, 'A') #替换字符
string.startswith('This') #是否以该字符串开始
string.endswith() #是否以该字符串结尾
string.split(' ') #分割字符串
'-'.join(string) #插入字符
string.strip() #消除两边空格
string.lstrip() #消除左边空格
string.rstrip() #消除右边空格
string.capitalize() #首字母大写
string.casefold() #首字母小写
string.lower() #全部小写
string.upper() #全部大写
string.title() #全部首字母大写
string.islower() #是否全部小写
string.isupper() #是否全部大写
string.istitle() #是否全部首字母大写
Built-In:list 类
# 全局信息:
len(l) #长度
sorted(l) #从小到大排序
list(set(l)) #值集
# 操作:
l.append(7) #在最后一项插入数字7
l.insert(2, 2.5) #在2处插入2.5
l.pop() #删除并返回最后一项
del l[-1] #删除最后一项
l.sort(reverse=False) #将数据按从小到大排列
l.reverse() #将列反向排列
list(map(float,l)) #将所有元素转为浮点形式
Numpy:NDArray 类
# 全局信息:
arr.shape #行列比
arr.dtype #数值类型
arr.T #行列转置
arr2.transpose(0,2,1) #第2维和第3维互换
arr.reshape([1,4]) #行列比调整为(1,4)
arr5.squeeze() #剔除所有长度为1的维度
arr5.reshape(-1) #剔除所有长度为1的维度并扁平化
arr5.ravel() #剔除所有长度为1的维度并扁平化
arr5.flatten() #剔除所有长度为1的维度并扁平化
arr.astype(np.int8) #数值类型改为np.int8
np.argsort(arr, axis=1) #每一行从小到大排序的索引
np.unique(arr) #值集
np.where(arr>1) #满足条件的值在每一维的位置
# 生成特殊矩阵:
np.arange(15) #生成0到14的向量
np.zeros((2,3)) #生成行列比(2,3)、值都为0的矩阵
np.ones((2,3)) #生成行列比(2,3)、值都为1矩阵
np.full((2,3),7) #生成行列比(2,3)、值都为7的矩阵
np.eye(5) #生成行列比(5,5)、对角线上值都为1的对角矩阵
np.random.random((2,3)) #生成行列比(2,3)的均匀随机数矩阵
np.random.randn(2,3) #生成行列比(2,3)的高斯随机数矩阵
np.random.seed(12) #使每次生成的随机数固定,随机代号为12
# 数学运算:
np.max(arr) #最大值
np.min(arr) #最小值
np.abs(arr) #绝对值
np.floor(arr) #向下取整
np.ceil(arr) #向上取整
np.percentile(arr,95) #百分位数
np.sqrt(9) #算术平方根
np.log(2.7) #自然对数
np.exp(3) #自然常数
np.dot(arr3,arr4) #矩阵相乘
np.matmul(arr3,arr4) #矩阵相乘
arr3*arr4 #矩阵点对点相乘
# 统计学运算:
np.sum(arr) #总和
np.prod(arr) #累乘
np.cumsum(arr) #累和
np.mean(arr) #均值
np.median(arr) #中位数
np.var(arr) #方差
np.std(arr) #标准差
np.corrcoef(arr) #相关系数
np.argmax(arr,axis=1) #最大值位置
np.bincount(arr[0]) #出现频率(仅整数)
# 跨数据操作:
np.concatenate((arr3,arr4), axis=0) #合并
np.vstack((arr3,arr4)) #纵向合并
np.hstack((arr3,arr4)) #横向合并
np.tile(arr, (2,3)) #2*3个矩阵合并
Pandas:Series 类
单独调用 DataFrame 的任何一列即为 Series,可调用 DataFrame 的任何公式。
# 全局信息:(仅当数值类型为str时可用)
s.str.len() #每一项的长度
s.str.lower() #每一个字母调整为小写
s.str.upper() #每一个字母调整为大写
s.str.split('|') #每一项按|进行切割
s.str.contains('as') #每一项是否包含as的True/False矩阵
s.str.replace('@', '$') #以$替代@
s.str.startswith ('T') #每一项是否以T开始的True/False矩阵
s.str.endswith('t') #每一项是否以t结尾True/False矩阵
s.str.find('e') #每一项第一个e的位置
# 统计学运算:
s1.cov(s2) #两组数据的协方差
s1.corr(s2) #两组数据的相关系数
# 数据处理:
pd.get_dummies(s) #生成Dummy列表
s.value_counts() #值集与数量
s.apply(lambda x: np.float(x)) #单元操作
Pandas:DataFrame 类
# 全局信息:
df.copy() #深赋值
df.shape #行列比
df.index #行序号
df.columns #所有列的名称
df.head(2) #头两行
df.tail(1) #尾一行
df.unique() #值集
df.nunique() #值集大小
df.isin([1,2,3]) #条件匹配
df2.sort_values(by=['0'], kind='mergesort') #按名为0的列排序的结果
df2.loc['a','one'] #行名称等于a、列名称等于one的数值
df2.iloc[0,0] #第0行、第0列的数值
df2.reindex(index=['a','b'], columns=['one','five']) #保留选中的行和列
df2.set_index('two') #将列设为行序列
df2.reset_index(drop=True) #重置行序列为0开始的整数数列(不加入原列序号)
df2.rename(columns={
'one':'two','two':'four'}) #重置列名称
# 统计学运算:
df.describe() #计数、均数、标准差、最小值、四分位数、最大值
df.sum() #求和
df.mean() #均值
df.median() #中位数
df.mode() #众数
df.var() #方差
df.std()