比较行中的值并将结果写入新列

2024-05-17 12:00:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据集如下所示:

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'中对其进行更改,并将其放入新列中

之后:

如果没有匹配项,我需要将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

我该怎么做?你知道吗


Tags: 数据idsnewabvalueadacpaste
1条回答
网友
1楼 · 发布于 2024-05-17 12:00:12

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

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

一点解释:

参数实际上是一个系列,索引值取自 列名。你知道吗

所以流行音乐('Paste_Values')删除第一个值,该值保存在v1其余的保持在rr中。你知道吗

然后v1[3:]提取v1的“其余部分”(没有“AE-”) 和结构包含检查rr的每个元素 在结束位置包含此字符串。你知道吗

有了这个解释,这个函数的其余部分应该是 可以理解。如果没有,则执行每个单独的指令 打印结果。你知道吗

唯一要做的就是把这个函数应用到你的数据帧上, 将结果替换为新列:

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'])

我没有收到这个数据的错误。对上述数据进行测试。 也许你的错误是在别的地方?你知道吗

可能您的数据帧还包含其他float)列, 你的问题中没有包括。 如果是这样,在数据帧的副本上运行我的函数, 删除此“其他”列。你知道吗

相关问题 更多 >