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.isin
和Series.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:替换字符串列值(等于、包含、大小写)的主要内容,如果未能解决你的问题,请参考以下文章