[英]conditionally Replace string in a Pandas series with another string
请看下面的例子。 要在一个特定的列中替换一个字符串,我已经做到了,它可以正常工作:
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
'data1': range(6),
'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1']},
columns = ['key', 'data1', 'data2'])
key data1 data2
0 A 0 A1
1 B 1 B1
2 C 2 C1
3 A 3 A1
4 B 4 B1
5 C 5 C1
df['data2']= df['data2'].str.strip().str.replace("A1","Bad")
key data1 data2
0 A 0 Bad
1 B 1 B1
2 C 2 C1
3 A 3 Bad
4 B 4 B1
5 C 5 C1
Q(1)如何有条件地替换一个字符串? 就是说,在data2
列中,我只想替换A1
但data2
if "key==A" and "data1">1
。 我怎样才能做到这一点?
Q(2)是否可以将条件替换应用于多次替换(即,用“不良”同时替换A1 and A2
,但只能在相似的条件下进行替换)?
您可以使用numpy
和基于regex
的替换来覆盖A1, A2
等。 如果我们将您的数据扩展为包括A3
的示例:
import pandas as pd
import numpy as np
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C', 'A'],
'data1': range(7),
'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1', 'A3']},
columns=['key', 'data1', 'data2'])
df['data2'] = np.where((df['key'] == 'A') & (df['data1'] > 1),
df['data2'].str.replace(r'A\d+','Bad'),
df['data2'])
返回:
key data1 data2
0 A 0 A1
1 B 1 B1
2 C 2 C1
3 A 3 Bad
4 B 4 B1
5 C 5 C1
6 A 6 Bad
我认为两面都需要过滤器列,仅替换过滤的行:
mask = (df['key']=="A") & (df['data1'] > 1)
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace("A1","Bad")
print (df)
key data1 data2
0 A 0 A1
1 B 1 B1
2 C 2 C1
3 A 3 Bad
4 B 4 B1
5 C 5 C1
如果需要多次替换,请使用dict
replace
:
df = pd.DataFrame({'key': ['A', 'A', 'C', 'A', 'B', 'C'],
'data1': range(6),
'data2': ['A1', 'A2', 'C1', 'A1', 'B1', 'C1']},
columns = ['key', 'data1', 'data2'])
mask = (df['key']=="A") & (df['data1'] > 0)
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().replace({"A1":"Bad", "A2":'Bad1'})
或使用正则表达式:
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace(r'^A.*',"Bad")
print (df)
key data1 data2
0 A 0 A1
1 A 1 Bad1
2 C 2 C1
3 A 3 Bad
4 B 4 B1
5 C 5 C1
如果我们要通过以下方式扩展上面的示例:
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
'data1': range(6),
'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1']},
columns = ['key', 'data1', 'data2'])
mask = (df['data1'] > 1)
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace("A1",df['key'])
key data1 data2
0 A 0 A1
1 B 1 B1
2 C 2 NaN
3 A 3 NaN
4 B 4 NaN
5 C 5 NaN
我以为data2的内容将被列“ key”的内容(在data1> 1的条件下)代替的答案让我感到非常惊讶。 任何想法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.