Python替换

字符串的替换 replace 函数

语法:

  1. string.replace(old,new,count)
    • string:要替换的字符串
    • old: (必选,字符串类型)被替换的字符串
    • new: (必选,字符串类型)替换后的字符串
    • count: (可选,整型)替换的次数
  2. str.replace(string,old,new,count)
    • old: (必选,字符串类型)被替换的字符串
    • new: (必选,字符串类型)替换后的字符串
    • count: (可选,整型)替换的次数
1
2
3
4
5
6
7
8
9
10
11
# 要做替换的字符串
a = '2023-11-10'

# 替换方式1
a.replace('-','')

# 替换次数 例如只替换 1 次
a.replace('-','',1)

# 指定替换次数为负数,则会全部替换.但是必须是整型int
a.replace('-','',-1)
'20231110'

'202311-10'

'20231110'
1
2
3
4
5
6
7
8
9
10
# 替换方式2
str.replace(a,'-','')

# replace() 不会改变原字符串的内容,而是返回一个新的字符串
a

# 连续替换
b ='I Love python'
b.replace('python','C++').replace('I','You')

'20231110'

'2023-11-10'

'You Love C++'
1
2
3
4
5
6
7
8
9
10
11
# 替换列表中的元素,获得新的列表
lst = [i for i in 'ABC']
lst
[i.replace('A','a') for i in lst]


# 替换字典中的键或值
dct ={k:v for v,k in enumerate(lst)}
dct

{k.replace('A','aa'):str(v).replace('1','100') for k,v in dct.items()}
['A', 'B', 'C']

['a', 'B', 'C']

{'A': 0, 'B': 1, 'C': 2}

{'aa': '0', 'B': '100', 'C': '2'}

字符串的替换 re.sub

语法:
re.sub(pattern, repl, string, count=0, flags=0)

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
1
2
3
4
5
6
7
8
9
10
11
12
13
a = 'address:123;number:456;date:789'
# 简单替换,将字符串中的 `:` 替换成 ` = `
re.sub(r':',' = ',a)


# reple 也可以是一个函数. 注意其中的函数 group()
repl = lambda x: '****' if x.group() == '123' else ('不允许公开的号码' if x.group() == '456' else '???')
re.sub(r'\d+',repl,a)

#
repl = lambda x: str(int(x.group()) + 100)
re.sub(r'\d+',repl,a)

'address = 123;number = 456;date = 789'

'address:****;number:不允许公开的号码;date:???'

'address:223;number:556;date:889'
1
2
3
4
5
6
7
8
9
10
11
file = r"C:\Users\xiaoyx\Desktop\231110\近三天均多头\231110_list.txt"

with open(file) as f1, open(f'{file}.bak','w',encoding='utf-8') as f2:
for line in f1:
# print(line)
# repl = lambda x :
f2.write(re.sub(r'\D+','',line))
os.remove(file)
os.rename(f'{file}.bak',file)
f1.close()
f2.close()
54

DataFrme 的值替换

  1. replace

    • df.replace(old,new)
    • df.replace({old:new,old,new})
  2. map

    • Series.map(arg,na_action =None)
      • arg : 映射一个 Series。它可以是一个集合或一个函数
      • na_action:处理 NaN(非数字)值。它可以取两个值-None 或 ignore。None 是默认值,map() 将把映射应用于所有值,包括 Nan 值;ignore 将 NaN 值留在列中,而不传递给映射方法。
  3. applymap

    • 语法:DataFrame.applymap(func, na_action=None, **kwargs)
    • func : 传入的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file = 'ddd.csv'
df = pd.read_csv(file,
# skiprows=[i for i in range(1,11)],
nrows=2,
parse_dates=['date'],
index_col='date',
)
df
# 将 bs列的 `0` 替换成 ` `, 将 `1` 替换成 `建仓`
df.replace(0,'').replace(1,'建仓')

# 将多个值替换成一个相同的值
df.replace([0,1],333)

# 字典形式, 字典的键:被替换的字符串,字典的值:替换后的字符串
## 实现用多个数值替换多个数值
df.replace({0:'',1:'建仓'})
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.180605 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489 0
2020-06-18 3.499128 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 1
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.180605 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489
2020-06-18 3.499128 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 建仓
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.180605 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489 333
2020-06-18 3.499128 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 333
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.180605 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489
2020-06-18 3.499128 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 建仓
1
2
3
4
5
6
7
8
df = pd.read_csv(file,
nrows=2,
parse_dates=['date'],
index_col='date',
)

df['open'] = df['open'].map(lambda x :f'{x :.2f}',na_action=None)
df
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.18 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489 0
2020-06-18 3.50 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 1
1
2
3
4
5
6
7
8
9
10
df = pd.read_csv(file,
nrows=2,
parse_dates=['date'],
index_col='date',
)

df
df.applymap(lambda x :f'{x:.2f}',na_action=None)
df.applymap(lambda x :f'{x:.2f}',na_action='ignore')
df.applymap(lambda x :round(x,2))
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.180605 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489 0
2020-06-18 3.499128 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 1
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.18 3.18 3.14 3.16 9718154.00 0.93 3.13 3.10 3.12 0.00
2020-06-18 3.50 3.52 3.45 3.52 10729909.00 0.59 3.46 3.46 3.46 1.00
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.18 3.18 3.14 3.16 9718154.00 0.93 3.13 3.10 3.12 0.00
2020-06-18 3.50 3.52 3.45 3.52 10729909.00 0.59 3.46 3.46 3.46 1.00
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.18 3.18 3.14 3.16 9718154 0.93 3.13 3.10 3.12 0
2020-06-18 3.50 3.52 3.45 3.52 10729909 0.59 3.46 3.46 3.46 1

loc方法替换列的值

语法:
DataFrame.loc[condition, column_label] = new_value

  1. condition:这个参数返回使条件为真的值。
  2. column_label:该参数用于指定要更新的目标列。
    通过参数确定值后,我们将其更新为 new_value。
1
2
3
4
5
6
7
8
9
10
df = pd.read_csv(file,
nrows=2,
parse_dates=['date'],
index_col='date',
)

df.loc[df.open > df.close,'bs'] = '收阴线'

df.loc[df.volume > 10000000, 'bs'] = '大成交量'
df
open high low close volume turn ma05 ma10 ma20 bs
date
2020-02-21 3.180605 3.180605 3.143274 3.158207 9718154 0.9316 3.134315 3.099970 3.123489 收阴线
2020-06-18 3.499128 3.518568 3.450529 3.518568 10729909 0.5944 3.464137 3.463165 3.464623 大成交量