数据处理笔记
pandas处理数据
-
pd.reset_index()
重置index索引并不删除空行,当DataFrame或Series类型的数据不是连续的索引或索引的输运不对,可以使用reset_index()重置索引。
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
drop = True 表示不保留原来的索引,即删除原来的索引,只保留新的索引
inplace=True 表示对原表生效
示例:df.reset_index(drop=True,inplace=True)
#
相关语法:set_index -
pd.dropna() 删除空值,即删除包含nan(空值)
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明:axis default 0指行,1为列
how {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的行
thresh int,保留含有int个非空值的行
subset 对特定的列进行缺失值删除处理
inplace 这个很常见,True表示就地更改示例:
df.dropna()
-
df.rename() 重新命名列名
rename方法作用: 复制 DataFrame并对其索引index和列标签columns进行赋值。如果希望就地修改某个数据集,传入inplace=True即可
示例:df.rename(columns={averageName:'average'},inplace=True)
-
df.mean()
Pandas中的df.mean()函数默认是等价于df.mean(0),即按轴方向求平均,得到每列数据的平均值。
示例:df['average'].mean()
求某一列的平均值 -
df.shift(periods=1, freq=None, axis=0) 移动
periods:类型为int,表示移动的幅度,可以是正数,也可以是负数,默认值是1,1就表示移动一次,注意这里移动的都是数据,而索引是不移动的,移动之后没有对应值的,就赋值为NaN。
freq: DateOffset, timedelta, or time rule string,可选参数,默认值为None,只适用于时间序列,如果这个参数存在,那么会按照参数值移动时间索引,而数据值没有发生变化。
示例:df1.shift(periods=1,freq=datetime.timedelta(1))
-
pd[‘列名’].values 获取值
取到的是该列对应的函数值
示例:df['diff_1'].values
-
df.loc[] 区域选取
区域选取可以从多个维度(行和列)对数据进行筛选,可以通过df.loc[],df.iloc[],df.ix[]三种方法实现。采用df.loc[],df.iloc[],df.ix[]这三种方法进行数据选取时,方括号内必须有两个参数,第一个参数是对行的筛选条件,第二个参数是对列的筛选条件,两个参数用逗号隔开。df.loc[],df.iloc[],df.ix[]的区别如下:
df.loc[]只能使用标签索引,不能使用整数索引,通过便签索引切边进行筛选时,前闭后闭。
df.iloc[]只能使用整数索引,不能使用标签索引,通过整数索引切边进行筛选时,前闭后开。
df.ix[]既可以使用标签索引,也可以使用整数索引。
示例:df.loc['a', :]
df.loc['a':'d', :]
df.loc[df['age']>30,:]
df.loc[lambda df:df['age'] > 30, :]
df.loc[:, 'name']
df.iloc[1, :]
df.loc[:,'Day'] = df['TimeStamp']
-
np.unique()
unique()是以 数组形式(numpy.ndarray)返回列的所有唯一值 -
df.columns 修改列名
示例:df.columns=['Day']
-
df.groupby()功能:分组
groupby + agg(聚集函数们): 分组后,对各组应用一些函数,如’sum’,‘mean’,‘max’,‘min’…
示例:df.groupby('Day')[feature].agg(函数名)
如:‘sum’、'mean’等 -
pd.merge() 合并Dataframe
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True, indicator=False, validate=None
left: 拼接的左侧DataFrame对象 right: 拼接的右侧DataFrame对象
on: 要加入的列或索引级别名称。必须在左侧和右侧DataFrame对象中找到。 如果未传递left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
right_on: 左侧DataFrame中的列或索引级别用作键。
可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。 left_index:
如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。
对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
right_index: 与left_index功能相似。
how: One of ‘left’, ‘right’,‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
copy:始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。
_merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。 -
df.rolling() 时间窗口函数
DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
后接min、max、mean等函数表示对这个窗口的操作
window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即从自己开始向前几个数据。如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。
min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。
center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。
其中的在计算时遇到的nan值做任何计算都为nan值 -
pd.read_csv()
pd.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, prefix=None,nrow=None,encoding =None)
1.filepath_or_buffer:(这是唯一一个必须有的参数,其它都是按需求选用的) 文件所在处的路径
2.sep: 指定分隔符,默认为逗号’,’
3.delimiter : str, default None 定界符,备选分隔符(如果指定该参数,则sep参数失效)
4.header:int or list of ints, default ‘infer’ 指定哪一行作为表头。默认设置为0(即第一行作为表头),如果没有表头的话,要修改参数,设置header=None
5.names: 指定列的名称,用列表表示。一般我们没有表头,即header=None时,这个用来添加列名就很有用啦!
6.index_col: 指定哪一列数据作为行索引,可以是一列,也可以多列。多列的话,会看到一个分层索引
7.prefix: 给列名添加前缀。如prefix=“x”,会出来"x1"、“x2”、"x3"酱纸
8.nrows : int, default None 需要读取的行数(从文件头开始算起)
9.encoding: 乱码的时候用这个就是了,官网文档看看用哪个 -
df.to_csv()
DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, c)
参数说明:path_or_buf=None 字符串或文件目录,文件路径或对象,如果未提供,结果将作为字符串返回。如果传递了一个文件对象,应该用换行= ’ ',禁用通用换行符。 sep=’,’ 输出文件的字段分隔符,默认点 na_rep=’’,缺失数据填充
float_format=None,小数点保留几位
columns=None, 要写入的字段
header=True,列名的别名 默认header=0,如果没有表头,设置header=None,表示我没有表头呀!
index=True,写行名(索引)
index_label=None,索引列的列标签。如果没有给出,并且header和index为True,则使用索引名。如果对象使用多索引,应该给出一个序列。如果不打印索引名称的字段。使用index
_ label = Falser以便在R中更容易导入
mode=‘w’ 写入模式,默认为w, r : 只能读, 必须存在, 可在任意位置读取 w : 只能写, 可以不存在, 必会擦掉原有内容从头写 a : 只能写, 可以不存在, 必不能修改原有内容, 只能在结尾追加写, 文件指针无效 r+ : 可读可写, 必须存在, 可在任意位置读写, 读与写共用同一个指针 w+ : 可读可写, 可以不存在, 必会擦掉原有内容从头写 a+ : 可读可写, 可以不存在, 必不能修改原有内容, 只能在结尾追加写, 文件指针只对读有效(写操作会将文件指针移动到文件尾)
encoding=None , 表示输出文件中使用的编码的字符串,默认为“utf-8”示例:
df.to_csv('../data'+'/'+f, index=False, header=False, mode='a+')
-
pd.concat() 拼接函数
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False)
注:行是一定会拼接的,如果列不完全相同,默认补全NaN再进行拼接
参数说明:objs: series,dataframe或者是panel构成的序列lsit ,注意是list列表
axis: 需要合并链接的轴,0是行,1是列 。 当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并
join:连接的方式 inner,或者outer。如果为’inner’得到的是两表的交集,如果是outer,得到的是两表的并集。
keys: 相接的时候在加上一个层次的key来识别数据源自于哪张表,可以增加key参数代码示例:
frames = [df1, df2, df3] result = pd.concat(frames) result = pd.concat(frames, keys=['x', 'y', 'z'])
pd.merge()函数只能实现两个表的拼接。
append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)
result = df1.append(df2)
-
pd.read_pickle() 和df.to_pickle()
df.to_pickle
使用DataFrame的to_pickle属性就可以生成pickle文件对数据进行永久储存
pd.read_pickle
使用pandas库的pd.read_pickle读取pickle数据
pickle 文件,以.pkl 为后缀名对于需要在数据中保持一定程度持久性的应用程序,Pickling非常有用。 您的程序的状态数据可以保存到磁盘,因此您可以稍后继续处理它。
它还可用于通过传输控制协议(TCP)或套接字连接(Socket)发送数据,或将python对象存储在数据库中。
当您使用机器学习算法时,Pickle非常有用,您可以将它们保存在以后能够进行新的预测,而无需重新编写所有内容或重新训练模型。 -
df.iterrows()
iterrows() 是在数据框中的行进行迭代的一个生成器,它返回每行的索引及一个包含行本身的对象。
for循环遍历dataframe,返回有一个元祖类型,第一个是行的索引,第二个是series,是每一行的内容。
示例:for index, row in df.iterrows(): print(index) # 行号 print(row) #这一行的内容,row['列名']
-
pd.drop() 删除数据
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
label : 要删除的行的索引或列的名称,具体行或列由aixs决定,label可以为列表,选择要删除的部分
axis=0,指删除index,因此删除columns时要指定axis=1;
inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;
inplace=True,则会直接在原数据上进行删除操作,删除后就回不来了示例:
_magn_res.drop(['label_M','label_long','label_lati'],axis=1,inplace=True) # 删除_magn_res中的'label_M','label_long','label_lati'列
-
df.sample() 随机选取若干行
只需要数据集中的一部分,并不需要全部的数据。这个时候我们就要对数据集进行随机的抽样。
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)[source]
- n 要抽取的行数 df.sample(n=3,random_state=1) 提取3行数据列表 注意,使用random_state,以确保可重复性的
- frac 抽取行的比例 例如frac=0.8,就是抽取其中80%。 df.sample(frac=0.8, replace=True, random_state=1)
- replace 是否为有放回抽样,True:有放回抽样 False:未放回抽样 True:取行数据后,可以重复放回后再取 False:取行数据后不放回,下次取其它行数据
注意:当N>总数据容量,replace设置为值时有效 - weights 字符索引或概率数组
- axis=0:为行字符索引或概率数组 axis=1:为列字符索引或概率数组
- random_state int: 随机数发生器种子 或numpy.random.RandomState
random_state=None,取得数据不重复 random_state=1,可以取得重复数据 - axis 选择抽取数据的行还是列 axis=0:抽取行 axis=1:抽取列
注意:当N>总数据容量,replace设置为值时有效 ,此时随机的抽,可能会重复,可以获得超过表本身数目更多的数据,来进行升采样
-
df[a][df[x]==条件]
根据后面中括号中条件为真,修改某一列的修改df中x列满足条件的a列的数据
因此可以在第二个中括号中填写df数据中要满足的调节,第一个中括号为要修改的列
示例:data['weight'][data['label_M']==0] = 1 #修改data中的label_M为0的weight列的值为1
OS 笔记
- os.listdir()
该方法用于返回指定文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序,不包括‘.’和‘…’即使其在文件夹中。
注意,返回的是目标文件夹中包含的文件或文件夹的名字,通常用于提取文件夹中文件,用一个循环遍历所有文件。
os.listdir('path')
中列出目录路径,即里面的参数path
示例:file_list = os.listdir(Folder_Path+'/'+n)
- **os.makedirs()**用来创建多层目录(单层请用os.mkdir)
os.makedirs(name, mode=0o777, exist_ok=False)
示例:os.makedirs(Folder_Path+'/'+EMSave_Dir+'/'+n, exist_ok=True)
参数说明:
name:你想创建的目录名
mode:要为目录设置的权限数字模式,默认的模式为 0o777 (八进制)。
exist_ok:是否在目录存在时触发异常。如果exist_ok为False(默认值),则在目标目录已存在的情况下触发FileExistsError异常;如果exist_ok为True,则在目标目录已存在的情况下不会触发FileExistsError异常。 - os.path.dirname(file)
功能:去掉文件名,返回目录。返回的是此文件所在的绝对路径,即Python文件所在的文件夹
示例:os.path.dirname("E:/Read_File/read_yaml.py")
返回的是E:/Read_File - os.getcwd()
返回当前工作目录。获取当前工作目录,也就是在哪个目录下运行这个程序。
示例:print(os.getcwd())
- os.path.join() 路径拼接
连接两个或更多的路径名组件- 如果各组件名首字母不包含’/’,则函数会自动加上
- 第一个以”/”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始
- 如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
示例:os.path.join('111','000/333')
时间转换函数
-
python自带的包:
import datetime
-
datetime.datetime.now()
返回现在的时间 -
将字符串类型转换为日期格式:
datetime.datetime.strptime()
我们输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()实现,需要一个日期和时间的格式化字符串。例如:datetime.datetime.strptime(‘2019-5-1 5:54:45’, ‘%Y-%m-%d %H:%M:%S’)
- %y 两位数的年份表示(00-99) - %Y 四位数的年份表示(000-9999) - %m 月份(01-12) - %d 月内中的一天(0-31) - %H 24小时制小时数(0-23) - %I 12小时制小时数(01-12) - %M 分钟数(00=59) - %S 秒(00-59) - %a 本地简化星期名称 - %A 本地完整星期名称 - %b 本地简化的月份名称 - %B 本地完整的月份名称 - %c 本地相应的日期表示和时间表示 - %j 年内的一天(001-366) - %p 本地A.M.或P.M.的等价符 - %U 一年中的星期数(00-53)星期天为星期的开始 - %w 星期(0-6),星期天为星期的开始 - %W 一年中的星期数(00-53)星期一为星期的开始 - %x 本地相应的日期表示 - %X 本地相应的时间表示 - %Z 当前时区的名称
-
日期格式转化为字符串格式的函数为:
datetime.datetime.strftime()
后台提取到datetime对象后,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的,同样需要一个日期和时间的格式化字符串:datetime.datetime.strftime(datetime.now(), “%Y-%m-%d %H:%M”)
- 或者直接使用:日期.strftime(‘预期的字符串格式’) 例:
begin_time.strftime('%Y-%m-%d-%H')
- 或者直接使用:日期.strftime(‘预期的字符串格式’) 例:
-
datetime日期格式中的属性
- datetime日期格式可以直接根据日期的方式进行比较大小
- datetime的:日期.day返回日期的day
- datetime可以做加减:加减之后结果可以用day,hour,second查看相差的结果,其中hour,minute,second限定在24小时以内
-
datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象。
datetime.timedelta(days,hours,minutes)
来设置差的时间,然后与日期时间相加减来查询需要的时间
例:datetime.timedelta(days=2)
-
获取今天的日期格式(年-月-日)
datetime.date.today()
-
时间戳中 86400 为一天秒数
时间差做差然后除以86400为相差的天数
zipfile 函数
-
用于解压文件
函数引入:import zipfile
-
zipfile.ZipFile()
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
示例:zipfile.ZipFile(Folder_Path+'/'+n+'/'+f, "r")
创建一个ZipFile对象,表示一个zip文件。参数file表示文件的路径或类文件对象(file-likeobject);参数mode指示打开zip文件的模式,默认值为’r’,表示读已经存在的zip文件,也可为’w’或’a’,'w’表示新建一个zip文档或覆盖一个已经存在的zip文档,'a’表示将数据附加到一个现存的zip文档中。参数compression表示在写zip文档时使用的压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。
-
ZipFile常用的方法和属性
- ZipFile.namelist()
获取zip文档内所有文件的名称列表。
示例:len(zFile.namelist())
- ZipFile.getinfo(name):
获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。将在下 面 具体介绍该对象。 - ZipFile.infolist()
获取zip文档内所有文件的信息,返回一个zipfile.ZipInfo的列表。 - ZipFile.extract(member[, path[, pwd]])
将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹;参数pwd为解压密码。
示例:zFile.extract(zFile.namelist()[0], Folder_Path+'/'+n)
- ZipFile.close()
ZipeFlie 类对象的关闭
- ZipFile.namelist()
Python的函数
-
python中type、dtype、astype 的用法
type 获取数据类型
dtype 数组元素的类型
astype 修改数据类型
示例:df['Day']astype(int)
-
endswith()
作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型
相关函数:判断字符串开头 startswith()
string.endswith(str, beg=[0,end=len(string)])
示例:f.endswith("zip")
参数说明:string: 被检测的字符串
str: 指定的字符或者子字符串(可以使用元组,会逐一匹配)
beg: 设置字符串检测的起始位置(可选,从左数起)
end: 设置字符串检测的结束位置(可选,从左数起) 如果存在参数 beg 和 end,则在指定范围内检查,否则在整个字符串中检查
返回值: 如果检测到字符串,则返回True,否则返回False。 -
assert()
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。 常在测试中用
示例:assert len(zFile.namelist()) == 1
-
format 格式化函数
一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
示例:"{} {}".format("hello", "world")# 不设置指定位置,按默认顺序
"{1} {0} {1}".format("hello", "world")# 设置指定位置
Pickle模块
-
pickle中的dump() 方法
引入模块:from pickle import dump
pickle.dumps(obj, file)
注释:序列化对象,将对象obj保存到文件file中去。
obj表示要保存的对象,
file必须有write()接口,file可以是一个以’w’打开的文件或者是一个String对象,也可以是任何可以实现write()接口的对象。
示例:with open('./new_tokenizer_v5.pickle', 'wb') as handle: pickle.dump(tokenizer, handle)
-
pickle中的load() 方法
pickle.load(file)
注释:反序列化对象,将文件中的数据解析为一个python对象。file中有read()接口和readline()接口
示例:with open(path, 'rb') as ff: s = load(ff)
-
存储为文件的后缀名可以为.bin文件,.bin 是个万能的后缀。
Numpy 模块
-
linspacy 创建等差数列
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
在start和stop之间返回均匀间隔的数据start:返回样本数据开始点
stop:返回样本数据结束点
num:生成的样本数据量,默认为50
endpoint:True则包含stop;False则不包含stop
retstep:If True, return (samples, step), where step is the spacing between samples.(即如果为True则结果会给出数据间隔)
dtype:输出数组类型 axis:0(默认)或-1
示例:>>> np.linspace(2.0, 3.0, num=5) array([ 2.0 , 2.25, 2.5 , 2.75, 3. 0 ])
-
np.sin()|np.cos()
a为ndarray对象
np.sin(a) 对矩阵a中每个元素取正弦
x是单个数据值:
np.sin(x) 对x元素取正弦
np.pi:是一个常量,代表3.1415926… -
np.zeros
返回来一个给定形状和类型的用0填充的数组;
参数:zeros(shape, dtype=float, order=‘C’)
shape:形状
dtype:数据类型,可选参数,默认numpy.float64
order:可选参数,c代表与c语言类似,行优先;F代表列优先示例:
np.zeros((2,5),dtype= np.int)
-
reshape()
numpy.reshape(a, newshape, order='C')
newshape:新的格式——整数或整数数组,如(2,3)表示2行3列。新的形状应该与原来的形状兼容,即行数和列数相乘后等于a中元素的数量。如果是整数,则结果将是长度的一维数组,所以这个整数必须等于a中元素数量。若这里是一个整数数组,那么其中一个数据可以为-1。在这种情况下,这个个值python会自动从根据第二个数值和剩余维度推断出来。
train_x.reshape(-1, 5, INPUT_FEATURES_NUM)