工作中遇到这样一个需求,思想比较简单,但是可以节省一些工作量,这里记录下来。
需求大致是这样的:
有一张type表,H列表示新能源汽车的款型,I列表示新能源汽车车型,但是H列格式并不规范,有的记录开头包含I列(车型)内容,如下图红色框选部分所示。对于这些内容我们希望将车型信息删除,H列统一格式,只包含款型信息,大致改为格式“*款车型”,如下图黄色所示。
Excel操作
**方法一:**使用IF函数判断并筛选出不符合命名规则的记录,符合规则的返回原数值,不符合规则的记录使用RIGHT函数将前几个包含车型信息的字符删除
=IF(ISERROR(SEARCH(I2,H2)),H2,RIGHT(H2,LEN(H2)-LEN(I2)-1))
******************************
IF(条件,a,b) 条件判断函数,条件满足返回a,不满足条件返回b
ISERROR(值) 查看值是否为错误值,Excel错误值有:#VALUE!,#N/A,#DIV/0!,#REF!,#NAME?,#NUM!,#NULL!等
SEARCH(字符,A1) 查看A1单元格是否包含某字符,第一个参数还支持通配符“*”和“?”,不区分英文大小写(区别于 FIND函数区分大小写)
RIGHT(A1,n) 截取单元格A1的值中最右面n个字符
结果如K列款型_1所示:
方法二:**使用IF函数判断并筛选出不符合命名规则的记录,符合规则的返回原数值,不符合规则的记录使用SUBSTITUTE函数将H列对应的I列内容用空白字符""替换
=TRIM(IF(ISERROR(SEARCH(I2,H2)),H2,SUBSTITUTE(H2,I2,"")))
********************************
SUBSTITUTE(text,old_text,new_text) 将文本text中old_text部分用new_text替换
TRIM(值) 将输入值中左右空格剔除
结果如J列款型_1_1所示:
Python操作
使用Python我们考虑分步骤操作,有几个比较常见的数据处理操作,在此记录以便以后使用。
一、Pandas判断每一行一列数据是否在另一列有展示
首先,我们建一张DataFrame
data = [['北京','上海','深圳','广州','杭州','南京','武汉','成都','苏州','青岛'],
['上海','南京','杭州','苏州','无锡','广州','深圳','东莞','香港','澳门']]
df = pd.DataFrame(data)
df = df.T
df.columns=['cities1','cities2']
首先我们想到的是in函数,但是要注意DataFrame不能整列比较,要使用df.apply方法,同时加上参数axis=1按行操作(df.apply默认按照axis=0按列操作)
df[df.apply(lambda x: x.cities2 in x.cities1, axis=1)]
二、Pandas判断一列数据每一个记录是否出现在另一列整个列表
在以上的基础上,我们将判断的基础增加到一整列值
df.cities2[df.apply(lambda x: x.cities2 in df.cities1.values, axis=1)]
#增加一列判断结果
df['result'] = df.apply(lambda x: 'yes' if x.cities2 in df.cities1.values else 'no', axis=1)
三、实证Pandas操作
对于工作中的实例,进行以下操作:
import pandas as pd
df = pd.read_excel(r'.\type.xlsx')
#新建一列'车型_1_2',每条记录满足款型包含车型信息的,车型用空字符串""替换,否则返回款型原数据
df['车型_1_2'] = df.apply(lambda x: x.款型.replace(x.车型,"") if x.车型 in x.款型 else x.款型, axis=1)
df.to_excel(./type_1.xlsx)
结果如下图所示: