连续比较值并将结果写入新列

时间:2019-06-06 18:24:58

标签: python pandas loops split string-matching

我的数据集如下:

Paste_Values AB_IDs AC_IDs    AD_IDs
AE-1001-4 AB-1001-0  AC-1001-3 AD-1001-2
AE-1964-7 AB-1964-2  AC-1964-7 AD-1964-1
AE-2211-1 AB-2211-1  AC-2211-3 AD-2211-2
AE-2182-4 AB-2182-6  AC-2182-7 AD-2182-5

我需要将Paste_values列中的所有值与一行中的所有其他三个值进行比较。

例如:

AE-1001-4分为两部分AE1001-4,我们需要检查1001-4是否存在其他列

如果它不存在,我们需要创建新的列并放置相同的AE-1001-4

如果1001-4与其他列匹配,我们需要将其更改为新列中的'AE-1001-5'inot

之后:

如果没有匹配项,我需要像在新创建的名为Paste_values的列中那样写new_paste_value的值。

如果同一行中的其他列中有匹配项(相同的值),那么我需要更改Paste_values列中值的最后一位,以使整个值不应与该行中所有其他完整值,并且该新生成的值应写入new_paste_value列中。

我需要对数据框中的每一行进行此操作。

所以结果应该像这样:

Paste_Values AB_IDs AC_IDs    AD_IDs     new_paste_value
AE-1001-4 AB-1001-0  AC-1001-3 AD-1001-2   AE-1001-4
AE-1964-7 AB-1964-2  AC-1964-7 AD-1964-1   AE-1964-3
AE-2211-1 AB-2211-1  AC-2211-3 AD-2211-2   AE-2211-4
AE-2182-4 AB-2182-6  AC-2182-4 AD-2182-5   AE-2182-1

我该怎么办?

1 个答案:

答案 0 :(得分:2)

从定义要应用于DataFrame每行的函数开始:

def fn(row):
    rr = row.copy()
    v1 = rr.pop('Paste_Values')   # First value
    if not rr.str.contains(f'{v1[3:]}$').any():
        return v1  # No match
    v1a = v1[3:-1] # Central part of v1
    for ch in '1234567890':
        if not rr.str.contains(v1a + ch + '$').any():
            return v1[:-1] + ch
    return '????'  # No candidate found

一些解释:

row 参数实际上是一个 Series ,其索引值取自 列名称。

因此 rr.pop('Paste_Values')会删除 first 值,该值保存在 v1 中 并且休息保留在 rr 中。

然后 v1 [3:] 提取 v1 的“其余”(不带“ AE-”) 和 str.contains 检查 rr 的每个元素是否 在结束位置包含此字符串。

有了这个解释,这个功能的其余部分应该相当 可以理解的。如果不是,则执行每个单独的指令,然后 打印结果。

唯一要做的就是将此函数应用于您的DataFrame, 将结果替换为新列:

df['new_paste_value'] = df.apply(fn, axis=1)

要运行测试,我创建了以下数据框:

df = pd.DataFrame(data=[
    ['AE-1001-4', 'AB-1001-0', 'AC-1001-3', 'AD-1001-2'],
    ['AE-1964-7', 'AB-1964-2', 'AC-1964-7', 'AD-1964-1'],
    ['AE-2211-1', 'AB-2211-1', 'AC-2211-3', 'AD-2211-2'],
    ['AE-2182-4', 'AB-2182-6', 'AC-2182-4', 'AD-2182-5']],
    columns=['Paste_Values', 'AB_IDs', 'AC_IDs', 'AD_IDs'])

我没有收到有关此数据的错误。对以上数据进行测试。 也许您的错误原因出在其他地方?

也许您的DataFrame还包含 other float )列, 您没有将其包括在问题中。 如果是这种情况,请在您的DataFrame副本上运行我的函数, 删除了该“其他”列。