Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换特定行中的子字符串_Python_Pandas - Fatal编程技术网

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)