python:使用df.replace处理区分大小写的更好方法

2024-09-28 16:59:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码来替换我的数据框-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

Tags: 数据代码in文本forif案例na
2条回答

您可以使用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

您可以将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)

相关问题 更多 >