Python中的循环和串阵列[英] Loop and arrays of strings in python

本文是小编为大家收集整理的关于Python中的循环和串阵列的处理方法,想解了Python中的循环和串阵列的问题怎么解决?Python中的循环和串阵列问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有以下数据集:

column1

HL111
PG3939HL11
HL339PG
RC--HL--PG

我试图编写一个执行以下操作的函数:

  1. 循环通过每行列1
  2. 只拉动字母表并放入阵列
  3. 如果阵列中有"HL",除非HL是数组中唯一的单词,否则将其从数组中删除.
  4. 在阵列和输出结果中获取第一个单词.
所以对于上面的示例,我的数组(步骤2)看起来像这样:

[HL]
[PG,HL]
[HL,PG]
[RC,HL,PG]

和我所需的最终输出(步骤4)看起来像这样:

desired_column

HL
PG
PG
RC

我有步骤2的代码,似乎工作正常

df['array_column'] = (df.column1.str.extractall('([A-Z]+)')
                    .unstack()
                    .values.tolist())

但我不知道如何从这里到达我的最终输出(步骤4).

推荐答案

您可以首先替换所有非字母来实现所需的内容,然后提取一对字母,然后应用一些自定义逻辑以从数组中提取必要的值:

>>> 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
>>> 

详细信息

  • .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]) - 自定义逻辑:如果列表长度为1并且它等于HL,请保留,否则删除所有HL并获取第一个元素

其他推荐答案

这是一个使用apply

的方法

演示:

import re
import pandas as pd

def checkValue(value):
    value = re.findall(r"[A-Z]{2}", value)
    if (len(value) > 1) and ("HL" in value):
        return [i for i in value if i != "HL"][0]
    else:
        return value[0]    

df = pd.DataFrame({"column1": ["HL111", "PG3939HL11", "HL339PG", "RC--HL--PG"]})
print(df.column1.apply(checkValue))

输出:

0    HL
1    PG
2    PG
3    RC
Name: column1, dtype: object

其他推荐答案

你可以做这样的事情(或可能是更优雅的东西),你已经让你到了一个相当好的结构,你可以使用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

本文地址:https://www.itbaoku.cn/post/1727822.html