Pandas 数据框列值不区分大小写替换 where <condition>

Pra*_*wan 5 python replace case-insensitive dataframe pandas

pandas.DataFrame.replace 是否有不区分大小写的版本?https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.DataFrame.replace.html

我需要根据“where label == a or label == b or label == c”形式的不区分大小写条件替换列中的字符串值。

gee*_*kly 11

其他一些答案的问题在于它们不适用于所有数据帧,仅适用于系列或可以隐式转换为系列的数据帧。我理解这是因为该.str构造存在于 Series 类中,但不存在于 Dataframe 类中。

要使用 Dataframes,您可以使用(?i)扩展使正则表达式不区分大小写。我不相信这在所有类型的 RegEx 中都可用,但它适用于 Pandas。

d = {'a':['test', 'Test', 'cat'], 'b':['CAT', 'dog', 'Cat']}
df = pd.DataFrame(data=d)

    a       b
0   test    CAT
1   Test    dog
2   cat     Cat
Run Code Online (Sandbox Code Playgroud)

然后像往常一样使用替换,但使用(?i)扩展名:

df.replace('(?i)cat', 'MONKEY', regex=True)

    a       b
0   test    MONKEY
1   Test    dog
2   MONKEY  MONKEY
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 5

我认为需要转换为lower,然后用条件替换isin

d = {'a':['test', 'Test', 'cat', 'CAT', 'dog', 'Cat']}
df = pd.DataFrame(data=d)

m = df['a'].str.lower().isin(['cat','test'])
df.loc[m, 'a'] = 'baby' 
print (df)
      a
0  baby
1  baby
2  baby
3  baby
4   dog
5  baby
Run Code Online (Sandbox Code Playgroud)

另一种解决方案:

df['b'] = df['a'].str.replace('test', 'baby', flags=re.I)
print (df)
      a     b
0  test  baby
1  Test  baby
2   cat   cat
3   CAT   CAT
4   dog   dog
5   Cat   Cat
Run Code Online (Sandbox Code Playgroud)