Pandas:替换字符串列值(等于、包含、大小写)

Posted

技术标签:

【中文标题】Pandas:替换字符串列值(等于、包含、大小写)【英文标题】:Pandas : Replace string column values (equal, contains, case) 【发布时间】:2020-07-15 07:27:53 【问题描述】:

我有如下datafarme。

ID   COUNTRY   GENDER    AGE  V1   V2   V3   V4   V5
1    1    1    53   APPLE     apple     bosck     APPLE123  xApple111t
2    2    2    51   BEKO beko SIMSUNG   SamsungO123    ttBeko111t
3    3    1    24   SAMSUNG   bosch     SEMSUNG   BOSC1123  uuSAMSUNG111t

如果列表中有相同的值或包含特定值,我想替换为 np.nan。 我在下面尝试但出现错误。

remove_list = ['APPLE', 'BEKO']

remove_contain_list = ['SUNG', 'bosc']

df.iloc[:,4:].str.replace(remove_list, np.nan, case=False) # exact match & case sensitive
df.iloc[:,4:].str.contains(remove_contain_list, np.nan, case=False) # contain & case sensitive

我该如何解决这些问题?

【问题讨论】:

你能正确格式化你的代码吗?数据应至少缩进四个空格 【参考方案1】:

您可以通过DataFrame.stack 创建MultiIndex Series,通过带有小写值的Series.isinSeries.str.contains 获取完全匹配和部分匹配的掩码,用Series.mask 替换(替换的默认值为NaN,所以没有必要的指定)并最后Series.unstack并分配回:

remove_list = ['APPLE', 'BEKO']
remove_contain_list = ['SUNG', 'bosc']

s = df.iloc[:,4:].stack(dropna=False)
m1 = s.str.lower().isin([x.lower() for x in remove_list])
m2 = s.str.contains('|'.join(remove_contain_list), case=False)
s = s.mask(m1 | m2)

df.iloc[:,4:] = s.unstack()
print (df)
   ID  COUNTRY  GENDER  AGE   V1   V2   V3        V4          V5
0   1        1       1   53  NaN  NaN  NaN  APPLE123  xApple111t
1   2        2       2   51  NaN  NaN  NaN       NaN  ttBeko111t
2   3        3       1   24  NaN  NaN  NaN       NaN         NaN

编辑:如果 Styler.apply 匹配,您可以将掩码替换为背景颜色:

def color(x): 
    c1 = 'background-color: yellow'
    c = ''

    remove_list = ['APPLE', 'BEKO']
    remove_contain_list = ['SUNG', 'bosc']

    s = x.iloc[:,4:].stack(dropna=False)
    m1 = s.str.lower().isin([i.lower() for i in remove_list])
    m2 = s.str.contains('|'.join(remove_contain_list), case=False)
    m = m1| m2

    df1 = pd.DataFrame(c, index=x.index, columns=x.columns)
    mask = m.unstack(fill_value=False).reindex(x.columns, fill_value=False, axis=1)   
    df1 = df1.mask(mask, c1)
    return df1

df.style.apply(color,axis=None)

【讨论】:

谢谢你,我能知道'|'.join的意思吗? @purplecollar - 表示正则表达式或 - first value of list OR second value of list 同上情况,如何将背景颜色改为黄色而不是替换? @purplecollar - 所以remove_list匹配是黄色的,remove_contain_list是红色的?预期输出如何? 如果列值对应remove_list或者包含remove_contain_list,我想把列的背景色改为黄色。

以上是关于Pandas:替换字符串列值(等于、包含、大小写)的主要内容,如果未能解决你的问题,请参考以下文章

如何替换 Pandas 数据框的字符串列中的文本?

如何让字符串列的所有包含匹配项?

在pandas中提取包含多行和多列的JSON字符串列的部分

从 pandas DataFrame 中的多个字符串列中删除子字符串

仅对带有 Pandas 的字符串列应用转换,忽略数字数据

在 Pandas 中将字符串列转换为日期的有效方法(在 Python 中),但没有时间戳