【问题标题】:Replace a string form one column in another column将字符串从一列替换到另一列
【发布时间】:2019-05-20 18:04:37
【问题描述】:

是否可以仅使用 pandas.Series.str 方法将一列中的字符串替换为 pandas 数据框中另一列中的相应字符串?“否”是可接受的答案,只要它伴随pandas 版本和文档的相关部分。

这是一个例子:

import pandas as pd
# version >= 0.19.2
df = pd.DataFrame(
    {
        'names': ['alice', 'bob', 'catherine', 'slagathor'],
        'hobbies': [
            'alice likes to knit',
            'bob likes to bowl',
            'plays with her cats',
            'slagathor burniates peasants for fun'
        ]
    }
)

def clean(df: pd.DataFrame) -> pd.Dataframe: ... # do the substitutions

assert all(
    clean(df).hobbies == pd.Series([
        'likes to knit',
        'likes to bowl',
        'plays with her cats',
        'burniates peasants for fun'
    ])
)

在这种情况下,我想从hobbies 列中省略name 列中的字符串,使用类似

df.hobbies.str.replace('(' + df.names + r'\s*)?', '')  # doesn't work

到目前为止,我不得不

import re
df['replaced'] = pd.Series(
    re.sub(f'^{df.names[i]} ?', '', df.hobbies[i]) for i in df.index
)  

如对Replace values from one column with another column Pandas DataFrame的回答

【问题讨论】:

  • 值得注意,但不是这个问题的一部分:在连接字符串上调用 re.sub 的解决方案需要清理这些字符串。我的实际数据集中包含'bob++''slag]athor' 之类的字符串。如果你不逃避r'[\[\](){}+*\\?]'re.complie(rf'^{name}\s*') 将会失败

标签: python python-3.x pandas


【解决方案1】:

str.replace是一个Series方法,所以它可以应用于每个元素 特定,但不可能引用任何其他 列。

所以你必须 import re 并在函数中使用 re.sub 应用于每个 row(以便此函数可以引用其他 当前行的列)。

您的任务可以在一条指令中执行:

df['replaced'] = df.apply(lambda row: re.sub(
    '^' + row.names + r'\s*', '', row.hobbies), axis=1)

此解决方案比使用 for 循环创建 Series 运行得更快 里面,然后在一个列下替换,因为 apply 需要 关心循环数据帧,所以应用的函数负责 仅用于生成要放入当前行的值。

关于执行速度的一个重要因素也是 您每次在循环中都避免按索引定位当前行。

如果索引是其他的,你的代码也不会失败 比从 0 开始的连续数字。 尝试例如用index=np.arange(1, 5) 创建你的DataFrame 参数。

【讨论】:

    【解决方案2】:

    apply with replace 将在这里完成工作

    df.apply(lambda x: x['hobbies'].replace(x['names'],''),axis=1)
    

    获取每一行数据框,并将“爱好”中的“姓名”替换为空字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多