【问题标题】:Update pandas DataFrame with .str.replace() vs .replace()使用 .str.replace() 与 .replace() 更新 pandas DataFrame
【发布时间】:2016-11-02 04:33:09
【问题描述】:

我的 pandas Dataframe df 中有一个列,其中包含一个带有一些尾随十六进制编码的 NULL (\x00) 的字符串。至少我认为是这样。当我尝试将它们替换为:

df['SOPInstanceUID'] = df['SOPInstanceUID'].replace('\x00', '')

该列未更新。当我做同样的事情时

df['SOPInstanceUID'] = df['SOPInstanceUID'].str.replace('\x00', '')

它工作正常。 这里有什么区别? (SOPInstanceUID 不是索引。)

谢谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您没有指定正则表达式或要求完全匹配,因此 str.replace 有效

    str.replace(old, new[, count])
    

    返回字符串的副本,其中所有出现的子字符串 old 都替换为 new。如果给定了可选参数 count,则仅替换第一个 count 出现。

    DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
    
    parameter: to_replace : str, regex, list, dict, Series, numeric, or None
    

    str 或正则表达式: str: 与 to_replace 完全匹配的字符串将被替换为 value 正则表达式:匹配 to_replace 的正则表达式将被替换为值

    它们实际上不在字符串中:您有未转义的控制字符,Python 使用十六进制表示法显示:

    通过以下方式删除所有非单词字符:

    re.sub(r'[^\w]', '', '\x00\x00\x00\x08\x01\x008\xe6\x7f')
    

    【讨论】:

    • 好的,谢谢你们俩。但是当我像这样调用替换时 codedf['SOPInstanceUID'].replace('\x00', '')code 我得到的字符串没有尾随NULL!?所以,它似乎匹配,还是只是某种不显示 NULL 的输出格式?
    • 您需要发布原始数据和代码来证明这一点,而且您的评论与您的​​问题陈述相矛盾,因为它不起作用
    • 是的,对不起。当我在没有分配回列的情况下调用该方法时,我在 jupyter 中得到了一个字符串输出,没有尾随的 NULL。在我的帖子中分配时 - 没有任何反应。令人困惑。
    • CMari,谢谢。那是缺少的部分!不是很明白,不过我试试看。
    【解决方案2】:

    前者查找exact matches,latter 查找字符串任何部分的匹配项,这就是后者适合您的原因。

    str 方法与标准的 string 等效方法同义,但已矢量化

    【讨论】:

    • 不是 OP,但感谢您提供的信息。只是一个愚蠢的问题,这里的矢量化是什么意思?
    • @BowenLiu 在这里矢量化意味着我们不是一次对单行或一个值进行操作,而是对整个列进行操作(尽管实际上它实际上意味着多个值),因此速度明显更快
    • 非常感谢您的解释。所以它可以一次对多个值进行操作,从而节省计算时间?
    • @BowenLiu 正确的矢量化在我看来是你应该使用 numpy 或 pandas 的原因。否则,它只是一种花哨的数据结构,使索引更容易而没有任何性能提升
    • 太棒了!我从没想过使用 pandas 和 numpy 进行数据处理的原因。我只是使用它,因为每个人都在使用它,它有很多有用的功能。但是这些函数运行良好且快速的原因是它们对所有数据进行了矢量化处理?你能用外行的话解释一下它是怎么做到的吗?我一直认为它像 for 循环一样逐个遍历对象。
    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2020-05-16
    相关资源
    最近更新 更多