代码之家  ›  专栏  ›  技术社区  ›  Claudiu Creanga

如何在pandas中的列中间添加字符串

  •  1
  • Claudiu Creanga  · 技术社区  · 7 年前

    我在寻找一个解决办法 包含一个.apply或lambda函数,该函数在列表中循环并在所需索引处添加字符串。我有这样一个列,有很多条目:

    df = pd.DataFrame(["1:77631829:-:1:77641672:-"], columns=["position"])
    
        position
    0   1:77631829:-:1:77641672:-
    

        position
    0   chr1:77631829:-:chr1:77641672:-
    

    所以在第三个冒号的开头和后面插入“chr” :

    我本以为这样做可以,但insert并没有在系列中实现:

    "chr" + df["position"].str.split(":").insert(3, "chr").str.join(":")
    

    "chr" + df["position"].str.split(":").str[:3].str.join(":") + "chr" + df["position"].str.split(":").str[3:].str.join(":")
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    7 年前

    3 : ,然后提取列表的头和尾-连接头,添加 ch 中国 最后一个附加到列表 L :

    df = pd.DataFrame(["1:77631829:-:1:77641672:-","1:77631829:-:1:77641672:-"], 
                      columns=["position"])
    print (df)
                        position
    0  1:77631829:-:1:77641672:-
    1  1:77631829:-:1:77641672:-
    
    L = []
    for x in df["position"]:
        *i, j = x.split(':', 3)
        L.append(("chr" + ':'.join(i) + "chr" + j))
    
    df['new'] = L
    print (df)
                        position                             new
    0  1:77631829:-:1:77641672:-  chr1:77631829:-chr1:77641672:-
    1  1:77631829:-:1:77641672:-  chr1:77631829:-chr1:77641672:-
    

    带注释的黑客解决方案:

    'chr' + df['position'].str.replace('-:', '-:chr')
    

    使用列表理解和f字串更快:

    df['new'] = [f"ch{x.replace('-:', '-:chr')}" for x in df['position']]
    

    性能

    df = pd.DataFrame(["1:77631829:-:1:77641672:-","1:77631829:-:1:77641672:-"], 
                      columns=["position"])
    
    #[20000 rows x 1 columns]
    df = pd.concat([df] * 10000, ignore_index=True)
    
    In [226]: %%timeit
         ...: L = []
         ...: for x in df["position"]:
         ...:     *i, j = x.split(':', 3)
         ...:     L.append(("chr" + ':'.join(i) + "chr" + j))
         ...: 
         ...: df['new1'] = L
         ...: 
    18.9 ms ± 1.25 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [227]: %%timeit
         ...: df['new2'] = "chr" + df["position"].str.split(":").str[:3].str.join(":") + "chr" + df["position"].str.split(":").str[3:].str.join(":")
         ...: 
    50.8 ms ± 1.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    In [228]: %%timeit
         ...: df['new3'] = 'chr' + df['position'].str.replace('-:', '-:chr')
         ...: 
    21.5 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    In [229]: %%timeit
         ...: df['new4'] = [f"ch{x.replace('-:', '-:chr')}" for x in df['position']]
         ...: 
    8.59 ms ± 130 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)