【问题标题】:Recognition and conversion of characters in specific positions特定位置字符的识别与转换
【发布时间】:2021-11-16 08:00:58
【问题描述】:

输入:

0      1     2
TNN    R11W  MSLQEMFRFPRGLLLGSVLLVASAPATL
ASTN1  E5V   MALAALCALLACCWGPAAVLATAAGDVDPSK
HSPB7  H19P  MSHRTSSTFRAERSFHSSHSSSSSSTSSSASRALPAQDPPMEK
CLCNKB C3Y   MECFVGLREGSSGNPVTLQELWGPCPRIRRGIRG
SZRD1  P10L  MEDEEVAESWEEAADSGEIDRRLEKKL

预期输出:

0      1     2
TNN    R11W  MSLQEMFRFPWGLLLGSVLLVASAPATL
ASTN1  E5V   NaN
HSPB7  H19P  MSHRTSSTFRAERSFHSSPSSSSSSTSSSASRALPAQDPPMEK
CLCNKB C3Y   MEYFVGLREGSSGNPVTLQELWGPCPRIRRGIRG
SZRD1  P10L  NaN

代码:示例

with open('temp.txt', 'w') as fw:
    for x in range(len(merge_two_files[1])):
        for i in range(len(merge_two_files[2])):
            if merge_two_files[1][x] == something:
                data = anything
                fw.write(str(data))

我想用“第 1 列”的索引更改“第 2 列”中的一个字符。例如,在第一行中,如果我检查“第 1 列”的索引,我会在“第 2 列”的第 11 个字符处罚款“R”。如果字符是“R”,我想将其更改为“W”。如果没有,我想在单元格中写“NaN”。很抱歉,对 Pandas 有什么建议吗?

【问题讨论】:

  • 您标记为“输出”的内容 - 是您的 实际 输出,还是您的 所需 输出?运行代码时会发生什么,为什么会出错?另外,我们应该如何解释该代码?我们没有 somethinganything 的值。
  • 请阅读How to Ask并解释你对这个问题的想法。您认为解决问题所需的逻辑步骤是什么?例如,如果我给你的代码可以处理一行,你能用它来处理整个数据表吗?

标签: python pandas find range


【解决方案1】:

编写自定义函数:

def replace_char(row):
    # explode 'R11W' into c='R', p=11, r='W'
    c, p, r =  (row[1][0], int(row[1][1:-1]), row[1][-1])
    s1 = row[2]
    s2 = np.NaN
    if s1[p-1] == c:
        s2 = f"{s1[:p-1]}{r}{s1[p:]}"
    return s2

df[2] = df.apply(replace_char, axis=1)

输出:

>>> df
        0     1                                            2
0     TNN  R11W                 MSLQEMFRFPWGLLLGSVLLVASAPATL
1   ASTN1   E5V                                          NaN
2   HSPB7  H19P  MSHRTSSTFRAERSFHSSPSSSSSSTSSSASRALPAQDPPMEK
3  CLCNKB   C3Y           MEYFVGLREGSSGNPVTLQELWGPCPRIRRGIRG
4   SZRD1  P10L                                          NaN

设置:

df = pd.read_csv('file1', header=None)
print(df)

# Output:
        0     1                                            2
0   ASTN1   E5V              MALAALCALLACCWGPAAVLATAAGDVDPSK
1   HSPB7  H19P  MSHRTSSTFRAERSFHSSHSSSSSSTSSSASRALPAQDPPMEK
2  CLCNKB   C3Y           MECFVGLREGSSGNPVTLQELWGPCPRIRRGIRG
3   SZRD1  P10L                  MEDEEVAESWEEAADSGEIDRRLEKKL

【讨论】:

  • 感谢您的回答。不幸的是,终端显示“IndexError:字符串索引超出范围”。不知道为什么,但我用 Pandas 阅读了这个文件。我认为这是问题所在。
  • 也许如果你分享你的文件,调试起来会更容易(dropbox、wetransfer、google drive,...)
  • 我真的很感谢你。那么,你能把你的“google drive”帐户给我吗?
  • 如果有人比我有更好的答案,请将您的文件分享给所有人。
  • 您没有共享您的文件,因此很难修复我的代码。
【解决方案2】:

这是我的答案:

data = [["TNN",    "R11W",  "MSLQEMFRFPRGLLLGSVLLVASAPATL"], ["ASTN1",  "E5V",   "MALAALCALLACCWGPAAVLATAAGDVDPSK"],
["HSPB7",  "H19P",  "MSHRTSSTFRAERSFHSSHSSSSSSTSSSASRALPAQDPPMEK"],
["CLCNKB", "C3Y",   "MECFVGLREGSSGNPVTLQELWGPCPRIRRGIRG"],
["SZRD1",  "P10L",  "MEDEEVAESWEEAADSGEIDRRLEKKL"]]


result = []

for row in data:
    res_row = []
    res_row.append(row[0])
    res_row.append(row[1])

    c1 = row[1][0]
    c2 = row[1][-1]
    num = int(row[1][1:-1])


    if row[2][num-1] == c1:
        c3 = (row[2])
        l = list(c3)
        l[num-1] = c2
        c3=''.join(l)
        res_row.append(c3)
    else:
        res_row.append("NaN")

    result.append(res_row)

print(result)

【讨论】:

  • 我想如果 OP 用pandas 标记了他的帖子,可能是因为输入是一个数据框。
  • @Corralien 你可能是对的,但我他没有在他的例子中自己指定,所以我做了对我来说最简单的事情
  • @Vaggelis_Lazarakis 很抱歉我错了。我想对 Pandas 有一个想法,但你的回答很好。非常感谢。
猜你喜欢
  • 2013-11-07
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2013-05-12
  • 2012-07-20
  • 2015-10-18
相关资源
最近更新 更多