【问题标题】:python: better way to handle case sensitivities with df.replacepython:使用 df.replace 处理区分大小写的更好方法
【发布时间】:2020-12-31 00:06:19
【问题描述】:

我有以下代码来替换我的数据框中的文本 - dfMSR。

oldtxts = ['NA', 'na']
newtxt = 'N/A'
for oldtxt in oldtxts:
    if oldtxt in dfMSR.values: 
        dfMSR = dfMSR.replace(oldtxt, newtxt, regex=True)
    else: 
        print("\nNo {oldtxt} in Dataframe") 

有没有更好的方法来替换所有案例场景而不用拼写出来或将数据框中所有文本的大小写更改为大写或小写?在上面的代码中,如果用户写了'Na',它不会被替换,因为我没有将它包含在oldtxts中。

编辑:添加示例数据和所需输出

dfMSR = pd.DataFrame({'A':['NA','na','O', '', 'N/A'],
          'B':['Anna','E','NA', 'Z', 'Na']})

想要的输出:

    A   B
0   N/A Anna
1   N/A E
2   O   N/A
3       Z
4   N/A N/A



Thanks

【问题讨论】:

  • 您可以添加数据框的示例吗?

标签: python pandas replace


【解决方案1】:

你可以使用str.replacecase参数,因为你提到了regex=True

dfMSR.apply(lambda x: x.astype(str).str.replace(r'\bna\b', 'N/A', regex=True,case=False))

请注意,如果它不是基于 Regex 的,它将无法工作

输出:

import pandas as pd
dfMSR = pd.DataFrame({'A':['NA','na','O', '', 'N/A'],
          'B':['Anna','E','NA', 'Z', 'Na']})
dfMSR
     A     B
0   NA  Anna
1   na     E
2    O    NA
3          Z
4  N/A    Na
dfMSR.apply(lambda x: x.astype(str).str.replace(r'\bna\b', 'N/A', regex=True,case=False))
     A     B
0  N/A  Anna
1  N/A     E
2    O   N/A
3          Z
4  N/A   N/A

【讨论】:

  • 阿伦,我读过有关设置 case=False 的信息,但它不起作用(TypeError: replace() got an unexpected keyword argument 'case')。当我在这里查看 .replace 文档pandas.pydata.org/pandas-docs/stable/reference/api/… 时,不能选择大小写。另外,您能否解释一下“如果它不是基于正则表达式”的意思。谢谢
  • 不是pandas.DataFrame.replace,而是pandas.Series.str.replace。不是基于正则表达式我的意思是如果regex=False,你不能使用这个选项。请添加示例数据和预期结果。 @SModi
  • 添加了数据+结果。要使用 series.str.replace,我需要一次做一列吗?
  • 我已经更新了答案。不,你不需要一次做一列。它将替换所有值。@SModi
  • 没有。 0s 不会被 NaNs 替换。我们只是检查na(不区分大小写) 并替换它。即使在您的示例数据中,也有一个0,我可以看到它没有被NaN 替换。 @SModi
【解决方案2】:

您可以将str.lower().replace 链接起来,而且您无需测试if 条件,因为它在替换中隐式完成:

dfMSR = dfMSR.apply(lambda x: x.str.lower()).replace(oldtxt, newtxt, regex=True)

在示例情况下,它看起来像这样:

pd.DataFrame({'A':['NA','na','O'],
          'B':['X','E','NA']}).apply(lambda x: x.str.lower()).replace('na','N/A',regex=True)

【讨论】:

  • Celius,我采用了您的代码:dfMSR.apply(lambda x: x.str.lower()).replace('na','N/A',regex=True) 。如果这是正确的,我得到了错误:AttributeError: Can only use .str accessor with string values!。我不想将所有列都转换为 dtype 字符串,因为数据中混合了字符串、布尔值、浮点数和日期。
  • 啊,好吧,那么如果你能告诉我你想应用的列列表,我可以修复你的代码以使其工作:)
  • 我不会有列的列表。数据创建者可能会添加新列,而我实际上想检查整个数据集。
  • (也同意,如果不需要声明。我将其插入以查看是否出现了 oldtxt - 因为数据在早期阶段被部分清理,由其他人处理。将将从最终代码中删除。)
猜你喜欢
  • 2012-12-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多