【问题标题】:Compare values in a row and write result in new column比较一行中的值并将结果写入新列
【发布时间】:2019-06-06 18:24:58
【问题描述】:

我的数据集如下所示:

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 与其他列匹配,我们需要将其更改为 int '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

我该怎么做?

【问题讨论】:

    标签: python pandas loops split string-matching


    【解决方案1】:

    从定义一个应用于 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 rest 保留在 rr 中。

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

    有了这个解释,这个函数的其余部分应该就差不多了 可以理解的。如果没有,请执行每个单独的指令并 打印他们的结果。

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

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

    为了运行测试,我创建了以下 DataFrame:

    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 的副本上运行我的函数, 删除此“其他”列。

    【讨论】:

    • 在尝试您的代码时出现此错误 TypeError: ("'float' object is not subscriptable", 'occured at index 7000')
    • 查看索引 == 7000 的行。也许它包含任何“非法”值?应该有 only 个字符串。您从哪里获取任何 float 值?
    • 这里是我的数据集类型 Paste_Values object AB_IDs object AC_IDs object AD_IDs object dtype: object
    • 我仍然认为问题出在您的数据中。运行我的代码,例如在源数据的前半部分和后半部分。下一个测试是对“失败”输入部分的一半重复运行。
    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多