分类 IT运维 下的文章

pandas replace() 替换用法
转载https://www.cnblogs.com/cgmcoding/p/13362539.html
pandas replace() 替换用法
 
2021.02.05补充

之前写的替换都是整个值,也即是说如果被替换值='asdfg',之前的只有值等于='asdfg',才可以被替换,但是我们很多时候是值想替换局部的,比如说‘深圳地区’,替换为‘深圳市’,那么就得先str,代码如下:

main_copy['city']=main_copy['city'].str.replace('地区','市')
====================================================================

replace()
既可以替换某列,也可以替换某行,还可以全表替换

df.replace() 或者 df[col]replace()

#参数如下:
df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad',)
 参数说明:
to_replace:被替换的值
value:替换后的值
inplace:是否要改变原数据,False是不改变,True是改变,默认是False
limit:控制填充次数
regex:是否使用正则,False是不使用,True是使用,默认是False
method:填充方式,pad,ffill,bfill分别是向前、向前、向后填充
复制代码
import pandas as pd
import numpy as np

#构造数据
df=pd.DataFrame({'a':['?',7499,'?',7566,7654,'?',7782],'b':['SMITH', '.','$','.' ,'MARTIM','BLAKE','CLARK'],
'c':['CLERK','SALESMAN','$','MANAGER','$','MANAGER','$'],
'd':[7902,7698,7698,7839,7698,7839,7839],
'e':['1980/12/17','1981/2/20','1981/2/22','1981/4/2','1981/9/28','1981/5/1','1981/6/9'],
'f':[800,1600,1250,2975,1230,2859,2450],
'g':[np.nan,300.0,500.0,np.nan,1400.0,np.nan,np.nan],
'h':[20,30,30,20,30,30,10]})


#替换全部或者某行某列
#全部替换,这二者效果一样
df.replace(20,30)
df.replace(to_replace=20,value=30)

#某一列或者某几列
df['h'].replace(20,30)
df[['b','c']].replace('$','rmb')

#某一行或者几行
df.iloc[1].replace(1600,1700)
df.iloc[1:3].replace(30,40)

#inplace=True
df.replace(20,30,inplace=True)
df.iloc[1:3].replace(30,40,inplace=True)


#用list或者dict进行单值或者多值填充,
#单值
#注意,list是前者替换后者,dict字典里的建作为原值,字典里的值作为替换的新值
df.replace([20,30])
df.replace({20:30})
#多值,list是list逗号后的值替换list的值,dict字典里的建作为原值,字典里的值作为替换的新值
df.replace([20,1600],[40,1700])  #20被40替换,1600被1700替换
df.replace([20,30],'b')  #20,30都被b替换
df.replace({20:30,1600:1700})
df.replace({20,30},{'a','b'})  #这个和list多值用法一样

#,method
#其实只需要传入被替换的值,
df.replace(['a',30],method='pad')
df.replace(['a',30],method='ffill')
df.replace(['a',30],method='bfill')

#可以直接这样表达
df.replace(30,method='bfill')  #用30下面的最靠近非30的值填充
df.replace(30,method='ffill')  #用30上面最靠近非30的值填充
df.replace(30,method='pad')   #用30上面最靠近非30的值填充

#一般用于空值填充
df.replace(np.nan,method='bfill') 

#limit
df.replace(30,method='bfill',limit=1)  #现在填充的间隔数
复制代码
正则替换的需要先补充一下正则表达式 
复制代码
#正则替换
#转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\
#如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r''表示''内部的字符串默认不转义
df.replace(r'\?|\.|\$',np.nan)  #和原来没有变化
df.replace(r'\?|\.|\$',np.nan,regex=True)#用np.nan替换?或.或$原字符
df.replace([r'\?',r'\$'],np.nan,regex=True)#用np.nan替换?和$
df.replace([r'\?',r'\$'],[np.nan,'NA'],regex=True)#用np.nan替换?用NA替换$符号
df.replace(regex={r'\?':None})

#当然,如果不想使用inplace=True,也可以这样子表达
df=df.replace(20,30)
df.replace(20,30,inplace=True)
复制代码
全部代码如下:
复制代码
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 21 10:52:00 2020

@author: Admin
"""



import pandas as pd
import numpy as np

#构造数据
df=pd.DataFrame({'a':['?',7499,'?',7566,7654,'?',7782],'b':['SMITH', '.','$','.' ,'MARTIM','BLAKE','CLARK'],
'c':['CLERK','SALESMAN','$','MANAGER','$','MANAGER','$'],
'd':[7902,7698,7698,7839,7698,7839,7839],
'e':['1980/12/17','1981/2/20','1981/2/22','1981/4/2','1981/9/28','1981/5/1','1981/6/9'],
'f':[800,1600,1250,2975,1230,2859,2450],
'g':[np.nan,300.0,500.0,np.nan,1400.0,np.nan,np.nan],
'h':[20,30,30,20,30,30,10]})


#替换全部或者某行某列
#全部替换,这二者效果一样
df.replace(20,30)
df.replace(to_replace=20,value=30)

#某一列或者某几列
df['h'].replace(20,30)
df[['b','c']].replace('$','rmb')

#某一行或者几行
df.iloc[1].replace(1600,1700)
df.iloc[1:3].replace(30,40)

#inplace=True
df.replace(20,30,inplace=True)
df.iloc[1:3].replace(30,40,inplace=True)


#用list或者dict进行单值或者多值填充,
#单值
#注意,list是前者替换后者,dict字典里的建作为原值,字典里的值作为替换的新值
df.replace([20,30])
df.replace({20:30})
#多值,list是list逗号后的值替换list的值,dict字典里的建作为原值,字典里的值作为替换的新值
df.replace([20,1600],[40,1700])  #20被40替换,1600被1700替换
df.replace([20,30],'b')  #20,30都被b替换
df.replace({20:30,1600:1700})
df.replace({20,30},{'a','b'})  #这个和list多值用法一样

#,method
#其实只需要传入被替换的值,
df.replace(['a',30],method='pad')
df.replace(['a',30],method='ffill')
df.replace(['a',30],method='bfill')

#可以直接这样表达
df.replace(30,method='bfill')  #用30下面的最靠近非30的值填充
df.replace(30,method='ffill')  #用30上面最靠近非30的值填充
df.replace(30,method='pad')   #用30上面最靠近非30的值填充

#一般用于空值填充
df.replace(np.nan,method='bfill') 

#limit
df.replace(30,method='bfill',limit=1)  #现在填充的间隔数



#正则替换
#转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\
#如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r''表示''内部的字符串默认不转义
df.replace(r'\?|\.|\$',np.nan)  #和原来没有变化
df.replace(r'\?|\.|\$',np.nan,regex=True)#用np.nan替换?或.或$原字符
df.replace([r'\?',r'\$'],np.nan,regex=True)#用np.nan替换?和$
df.replace([r'\?',r'\$'],[np.nan,'NA'],regex=True)#用np.nan替换?用NA替换$符号
df.replace(regex={r'\?':None})

#当然,如果不想使用inplace=True,也可以这样子表达
df=df.replace(20,30)
df.replace(20,30,inplace=True)

转自:https://blog.csdn.net/vertual/article/details/34540555

ORACLE里锁有以下几种模式: 
0:none 
1:null 空 
2:Row-S 行共享(RS):共享表锁,sub share  
3:Row-X 行独占(RX):用于行的修改,sub exclusive  
4:Share 共享锁(S):阻止其他DML操作,share 
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive  
6:exclusive 独占(X):独立访问使用,exclusive

1.oracle提供的所类型可以根据v$lock_type 中的type来查询,我们平时接触的最多的是两种

select * from v$lock_type where type in ('TM','TX')

查看描述,可以大概的得知两种锁的信息.TM是同步访问对象用的,TX是和事务有关的.

2.要知道的有2个概念:

(1).锁定数据的锁,也就是行级锁,只有一种:排它锁 exclusive (ROW)
(2).锁定表上的锁,即锁定元数据的锁 metadata(table),一共有5种:

  RS: row share
  RX: row exclusive
  S: share
  SRX: share row exclusive
  X: exclusive4.根据oracle联机文档的concepts的

  我们可以从这个表找出至少2个东西,.第一是每种数据库操作都对应的是什么样的锁(参考中间那一列),第二是每种锁之间,如果遇到之后是否会产生冲突,所谓冲突就是是否会使当前的数据库操作夯住.其中Y*,表示如果两个操作锁定的是同一行,那么就会有冲突,后操作的会等待前一个操作完成之后再完成,否则会一直夯在那儿;如果不为同一行,那么则不会冲突,后操作的不会等待.举一个例子来说明:假设现在A操作为:对id=1的记录进行update,而B操作为:对id=2的记录进行删除,根据表格说明,在A上操作时在TM级别的锁会是RX,TX级别只有一个是X,在B上会有一个TM级别的锁会是RX,TX级别只有一个X,而根据表格说明,当RX遇到RX的时候,如果2个操作非同一条记录,那么则不会冲突,故AB两个操作均会按照各自的先加一个TM锁,再加一个TX锁,再顺利执行各自的操作,不会夯住。如果将B操作的记录id换位1,那么两个操作记录为同一条记录,在TM锁上会表现出冲突,所以B操作就会等待A操作完成提交后(也就是A的TX锁释放了后),B再相应的生成一个TX锁和一个TM锁再完成操作,否则的话会一直夯住,等待A释放TX锁.

3.常用的动态性能视图:

select * from v$lock_type where type in ('TM','TX');

select * from v$lock;
select * from v$transaction;

重点说明一下v$lock视图:

先设置一个场景:在session A中对一个表的记录进行更新,更新完后并不提交,在session B中对改表的同一条记录进行删除



  很清晰的看到2个sid产生了锁.对于sid为140的session,产生了一个TM和一个TX锁,TM的锁模式(LMODE)=3,(3为RX: row exclusive和表格对照相符,当操作为update的时候,产生RX锁);对于sid为147的session,也产生了一个TM和一个TX锁,TM的锁模式(LMODE)=3 (3为RX: row exclusive和表格对照相符,当操作为delete的时候,产生RX锁),而TX的锁模式(LMODE)=0,代表正在等待一个锁.从v$lock_type的定义上面,我们也可以看出,type为TM的锁,ID1表示的是object_id,查询dba_objects可以很容易的得出锁定的对象是TTT这个obj. 从最后一列BLOCK(该block并不代表块,而是代表阻塞)=1也可以看出,sid=140的session在生成TX锁之后,发现之后一个的操作也是修改该条记录,所以BLOCK+1,表示阻塞其他的操作同时操作这条记录.

另外,此时,查询select * from v$transaction;视图,也可以得到相关联的信息

我们从v$lock_type对TX锁的描述,可以知道TX是和事务有关的.因此查看之前v$lock上TX锁的相关信息,可以看到ADDR的值与v$transaction的值是一样的.甚至可以根据ID1的值来计算,锁定的是哪个段:根据TX的ID1去除以和取余2的16次方,得到相关信息:



接着再在改表上创建一个索引  create index idx_ttt on ttt(object_id);

创建索引的同时,查询v$lock表

可以发现在创建索引的会生成2个TM锁,锁类别分别为4和3,我们查询这2个TM分别锁定的是什么对象:

根据查询结果发现lmode=4的object_id为55160的对象对应的是TTT这个表,LMODE=4对应的是TM的S锁

总结

1级锁有:Select,有时会在v$locked_object出现。 
2级锁有:Select for update,Lock For Update,Lock Row Share  
select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。 
3级锁有:Insert, Update, Delete, Lock Row Exclusive 
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。 
4级锁有:Create Index, Lock Share 
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。 
00054, 00000, "resource busy and acquire with NOWAIT specified" 
// *Cause: Resource interested is busy. 
// *Action: Retry if necessary. 
5级锁有:Lock Share Row Exclusive  
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。 
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive

 

Oracle进程无法KILL处理方案:

出处:

1.oracle提供的所类型可以根据v$lock_type 中的type来查询,我们平时接触的最多的是两种

Oracle进程被KILL之后,状态被置为"KILLED",但是锁定的资源长时间不释放,会出现类似下面这样的错误提示:

ORA-00030: User session ID does not exist

或

ORA-00031: session marked for kill

以往大多都是通过重启数据库的方式来强行释放锁资源。
现提供另一种方式解决该问题,在ORACLE中KILL不掉,在OS系统中再杀,操作方式如下:

1.下面的语句用来查询哪些对象被锁:
select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid;
2.下面的语句用来杀死一个进程:
alter system kill session '42,21993';
3在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=24 (24是上面的sid)
4.在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 12345(即第3步查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即第3步查询出的spid。

 

redhat linux7.3系统,安装11.2.0.4集群
(两个节点都要执行)

有问题的节点观察到的现象是
1,开机只有ohasd.bin ,init.ohasd进程,
2,系统日志显示 autorun file for ohasd is missing
3,检查ohasdrun 内容为reboot,用vi看后面多了个^@符号,看权限是root:oinstall 与正常节点对比,权限一样.

4,看了init.ohasd内容,感觉是因为判断ohasdrun文件存不存在的步骤没有正常进行,导致系统日志显示autorun file for ohasd is missing
不停循环每10s出现一次autorun file for ohasd is missing

5,kill掉init.ohasd 进程,系统自动重新运行init.ohasd进程后集群正常启动,所有资源正常.
其它操作都没有,只是kill /etc/init.d/init.ohasd run 进程之后集群就能正常启动了.
此时ohasdrun 显示restart

本来用excel的宏功能也能实现大部分,但是为了练习python语法,还是用pandas重新弄了一个脚本程序,基本满足需求,后面有时间再部署一个django的平台进行管理。
# -- coding: utf-8 --

import os
import pandas as pd
import configparser as cf

parent_dir = os.path.dirname(os.path.abspath(__file__))
cf = cf.ConfigParser()
try:
    cf.read(parent_dir + "\\config.ini")
except IOError:
    print("Error: 没有找到配置或读取文件失败")
else:
    print("读取配置文件成功")
sections = cf.sections()#获取配置文件中所有sections,sections是列表
# def xlsx(file):
#     file=cf.get('file', 'xlsx')
#
def main():

    workbookname = cf.get('xlsxfile', 'workbookname')
    workbookname=parent_dir+"\\"+workbookname

    sheetname1 = cf.get('xlsxfile', 'sheetname1')
    sheetname2 = cf.get('xlsxfile', 'sheetname2')
    xlsxcolums= cf.get('xlsxfile', 'xlsxcolums')
    sortcolums = cf.get('xlsxfile', 'sortcolums')
    screenkeywords1 = cf.get('xlsxfile', 'screenkeywords1')
    screenfactor1 = cf.get('xlsxfile', 'screenfactor1')
    screenfactor2 = cf.get('xlsxfile', 'screenfactor2')
    screenfactor3 = cf.get('xlsxfile', 'screenfactor3')
    screenfactor4 = cf.get('xlsxfile', 'screenfactor4')
    workbooknamenew = cf.get('xlsxfile', 'workbooknamenew')
    xlsxcolums = xlsxcolums.strip(',').split(',')

    xlsx1 = pd.read_excel(workbookname, sheet_name=sheetname1)
    xlsx2 = pd.read_excel(workbookname, sheet_name=sheetname2)
    xlsx1 = xlsx1.loc[:,xlsxcolums]
    xlsx1 = xlsx1.sort_values(by=sortcolums)
    xlsx1 = xlsx1.loc[(xlsx1[screenkeywords1] == screenfactor1) |(xlsx1[screenkeywords1] == screenfactor2)|(xlsx1[screenkeywords1] == screenfactor3)|(xlsx1[screenkeywords1] == screenfactor4)]
    xlsx2 = xlsx2.loc[:,xlsxcolums]
    xlsx2 = xlsx2.sort_values(by=sortcolums)
    xlsx2 = xlsx2.loc[(xlsx2[screenkeywords1] == screenfactor1) |(xlsx2[screenkeywords1] == screenfactor2)|(xlsx2[screenkeywords1] == screenfactor3)|(xlsx2[screenkeywords1] == screenfactor4)]
    xlsx = xlsx1.append(xlsx2)
    try:
        xlsx.to_excel(parent_dir + "\\" + workbooknamenew)
        print("更新成功")
    except IOError:
        print("Error: 保存文件失败")


    #     xlsx.to_excel(parent_dir+"\\"+workbooknamenew)
    # except IOError:
    #     print("Error: 没有找到配置或读取文件失败")





# def resolveEnv(con):
#     if con.startswith('ENV_'):
#         return os.environ.get(con)
#     return con



if __name__ == "__main__":
    main()

import pandas as pd

df1 = pd.DataFrame([1, 2, 3])
print(df1.columns)
df2 = pd.DataFrame([1, 2, 4])
xlsx = pd.read_excel(r"C:\Users\Administrator\PycharmProjects\pythonProject2\venv\工单记录.xlsx", sheet_name='区级数据修改')
xlsx1 = pd.read_excel(r"C:\Users\Administrator\PycharmProjects\pythonProject2\venv\工单记录.xlsx", sheet_name='市级数据修改')
# tiaojian=xlsx['工单状态']
print(type(xlsx))
# print(xlsx)
# print(xlsx.columns) #打印列标题
# print(xlsx.index) #打印行索引
# print(xlsx.shape)
xlsx=xlsx.loc[:,['工单状态','工单编号','子系统','数据库名称','数据库IP地址','标题']] #取出指定的列
xlsx1=xlsx1.loc[:,['工单状态','工单编号','子系统','数据库名称','数据库IP地址','标题']] #取出指定的列
xlsx=xlsx.sort_values(by='数据库IP地址')#排序
xlsx=xlsx.loc[(xlsx['工单状态']=='已撤销')  | (xlsx['工单状态']=='审批中')] #取出满足多个条件的行,同时满足用&
xlsx1=xlsx1.loc[(xlsx1['工单状态']=='已撤销')  | (xlsx1['工单状态']=='审批中')] #取出满足多个条件的行,同时满足用&
xlsx1=xlsx1.sort_values(by='数据库IP地址')#排序
# xlsx=xlsx.loc[xlsx['工单状态']=='已撤销'] #取出满足条件的行
print(xlsx.shape) #输出总行数和列数,要+1.

print(xlsx1.shape)



xlsx=xlsx.append(xlsx1)
# df1.to_excel(r'C:\Users\Administrator\PycharmProjects\pythonProject2\venv\test1.xlsx')
# df2.to_excel(r'C:\Users\Administrator\PycharmProjects\pythonProject2\venv\test2.xlsx')
print(xlsx.shape)
xlsx.to_excel(r'C:\Users\Administrator\PycharmProjects\pythonProject2\venv\test3.xlsx')
#
# ,'数据库名称','数据库IP地址','标题'