Python 替换特定行中的子字符串
对于以下数据帧Python 替换特定行中的子字符串,python,pandas,Python,Pandas,对于以下数据帧 my_cols = ["a", "b", "c"] df2 = pd.DataFrame([["1a", "2a", "3a"], ["4aa", "5a", "6a"], ["7a", "8a", "9a"], ["1a", "2a", "3a"], ["4a", "5a", "6a"], ["7a", "8a", "9a"]], columns=my_cols) df2: a
my_cols = ["a", "b", "c"]
df2 = pd.DataFrame([["1a", "2a", "3a"], ["4aa", "5a", "6a"], ["7a", "8a", "9a"],
["1a", "2a", "3a"], ["4a", "5a", "6a"], ["7a", "8a", "9a"]],
columns=my_cols)
df2:
a b c
0 1a 2a 3a
1 4a 5a 6a
2 7a 8a 9a
3 1a 2a 3a
4 4a 5a 6a
5 7a 8a 9a
我想计算一个值是否在任何一行包含子字符串4a
。在这种情况下,我想通过b
在整行重新分配任何a
my_str = "4a"
for x in range(df2.shape[0]):
if my_str in df2["a"][x]:
for y in range(len(my_cols)):
df2[my_cols[y]][x] = df2[my_cols[y]][x].replace("a","b")
df2:
a b c
0 1a 2a 3a
1 4ba 5b 6b
2 7a 8a 9a
3 1a 2a 3a
4 4b 5b 6b
5 7a 8a 9a
由于多个循环和
replace()
完成的赋值,此方法似乎效率太低。是否有一些内置的方法可以完成这项工作?如有任何改进,我们将不胜感激。可能的解决方案如下:
my_cols = ["a", "b", "c"]
df2 = pd.DataFrame([["1a", "2a", "3a"], ["4aa", "5a", "6a"], ["7a", "8a", "9a"],
["1a", "2a", "3a"], ["4a", "5a", "6a"], ["7a", "8a", "9a"]],
columns=my_cols)
mask = df2.apply(lambda row: row.astype(str).str.contains('4a').any(), axis=1)
df2.loc[df2[mask].index, df2.columns] = df2[mask].replace({'a': 'b'}, regex=True)
df2:
a b c
0 1a 2a 3a
1 4bb 5b 6b
2 7a 8a 9a
3 1a 2a 3a
4 4b 5b 6b
5 7a 8a 9a
首先,我们创建一个掩码,用于标识至少有一列包含子字符串“4a”的所有行。然后,我们用行的副本更新这些行,在这些行中,我们将每个“a”替换为“b”。感谢@yatu和@Alessia Mondolo的贡献,这将是答案:
m = df2["a"].str.contains(my_str, na=False)
df2[m] = df2[m].replace({'a': 'b'}, regex=True)