python中的字符串循环和数组
我有以下数据集:python中的字符串循环和数组,python,arrays,regex,pandas,loops,Python,Arrays,Regex,Pandas,Loops,我有以下数据集: column1 HL111 PG3939HL11 HL339PG RC--HL--PG 我正在尝试编写一个函数,该函数执行以下操作: 循环遍历列1的每一行 只拉字母表并放入数组 如果数组中有HL,请将其从数组中删除,除非HL是数组中唯一的字。 获取数组中的第一个字并输出结果。 因此,对于上面的示例,我的数组步骤2如下所示: [HL] [PG,HL] [HL,PG] [RC,HL,PG] desired_column HL PG PG RC 我期望的最终输出步骤4如下所
column1
HL111
PG3939HL11
HL339PG
RC--HL--PG
我正在尝试编写一个函数,该函数执行以下操作:
循环遍历列1的每一行
只拉字母表并放入数组
如果数组中有HL,请将其从数组中删除,除非HL是数组中唯一的字。
获取数组中的第一个字并输出结果。
因此,对于上面的示例,我的数组步骤2如下所示:
[HL]
[PG,HL]
[HL,PG]
[RC,HL,PG]
desired_column
HL
PG
PG
RC
我期望的最终输出步骤4如下所示:
[HL]
[PG,HL]
[HL,PG]
[RC,HL,PG]
desired_column
HL
PG
PG
RC
我有步骤2的代码,它似乎工作得很好
df['array_column'] = (df.column1.str.extractall('([A-Z]+)')
.unstack()
.values.tolist())
但是我不知道如何从这里开始到最后的输出步骤4。这是使用apply的一种方法 演示: 输出:
level_0
0 HL
1 PG
2 PG
3 RC
dtype: object
您可以通过先替换所有非字母,然后提取字母对,然后应用一些自定义逻辑从数组中提取必要的值来实现所需的功能:
>>> df['array_column'].str.replace('[^A-Z]+', '').str.findall('([A-Z]{2})').apply(lambda d: [''] if len(d) == 0 else d).apply(lambda x: 'HL' if len(x) == 1 and x[0] == 'HL' else [m for m in x if m != 'HL'][0])
0 HL
1 PG
2 PG
3 RC
Name: array_column, dtype: object
>>>
细节
。替换“[^A-Z]+”,删除除大写字母以外的所有字符
.str.findall'[A-Z]{2}'-提取字母对
.applylambda d:[]如果lend==0,则如果上一步中没有正则表达式匹配项,则d将添加一个空项
.applylambda x:'HL'if lenx==1和x[0]='HL'else[m for m in x if m!='HL'][0]-自定义逻辑:如果列表长度为1且等于HL,则保留它,否则删除所有HL并获取第一个元素
您可以做类似的事情,或者可能做一些更优雅的事情,您已经得到了一个相当好的结构,您可以使用groupby来完成您的解决方案
def extract_relevant_str(grp):
ret_val = None
if "HL" in grp[0].tolist() and len(grp) == 1:
ret_val = "HL"
elif len(grp) >= 1:
ret_val = grp.loc[grp[0] != "HL", 0].iloc[0]
return ret_val
items = df.column1.str.extractall('([A-Z]+)')
items.reset_index().groupby("level_0").apply(extract_relevant_str)
输出:
level_0
0 HL
1 PG
2 PG
3 RC
dtype: object
如果手机上没有字母,你会怎么想!!!!!或11111?如果单元格没有字母,则结果可以为空或添加null,以处理没有字母的单元格并遵循初始逻辑。