代码之家  ›  专栏  ›  技术社区  ›  U13-Forward

如何用字符串连接一列和另一列-熊猫

  •  0
  • U13-Forward  · 技术社区  · 4 年前

    我刚碰到一个问题,我该怎么办 str.join 由一列加入另一列,这里是我的 DataFrame :

    >>> df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
       a      b
    0  a  hello
    1  b   good
    2  c  great
    3  d   nice
    

    我想要这个 a b 列,所以我想要的输出是:

       a          b
    0  a  haealalao
    1  b    gbobobd
    2  c  gcrcecact
    3  d    ndidcde
    

    我该怎么办?

    希望您能看到与此相关的内容,下面是一个示例,第一行可以在python中执行:

    >>> 'a'.join('hello')
    'haealalao'
    >>> 
    

    就像期望的输出一样。

    我认为了解两个专栏如何相互作用可能会有用。 join 可能不是最好的例子,但是您可以执行其他函数。如果你使用 split 分裂 或者将其他列中的字符替换为其他字符。

    2 回复  |  直到 4 年前
        1
  •  3
  •   U13-Forward    4 年前

    下面的代码是我能从这个问题中得出的最快答案:

    it = iter(df['a'])
    df['b'] = [next(it).join(i) for i in df['b']]
    

    上面的代码首先生成 a next 对于每次获取下一个值,则在列表中它将两个字符串连接起来。

    长话短说:

    展示我的解决方案:

    解决方案1:

    使用 list 理解和发电机:

    it = iter(df['a'])
    df['b'] = [next(it).join(i) for i in df['b']]
    print(df)
    

    解决方案2:

    按索引分组,然后 apply str.join 两列的值:

    df['b'] = df.groupby(df.index).apply(lambda x: x['a'].item().join(x['b'].item()))
    print(df)
    

    解决方案3:

    列表 对列和列进行迭代的理解 str.join公司 学生:

    df['b'] = [x.join(y) for x, y in df.values.tolist()]
    print(df)
    

       a          b
    0  a  haealalao
    1  b    gbobobd
    2  c  gcrcecact
    3  d    ndidcde
    

    时间安排:

    现在是时候开始计时了 timeit 模块,下面是我们用来计时的代码:

    from timeit import timeit
    df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
    def u11_1():
        it = iter(df['a'])
        df['b'] = [next(it).join(i) for i in df['b']]
        
    def u11_2():
        df['b'] = df.groupby(df.index).apply(lambda x: x['a'].item().join(x['b'].item()))
        
    def u11_3():
        df['b'] = [x.join(y) for x, y in df.values.tolist()]
    
    print('Solution 1:', timeit(u11_1, number=5))
    print('Solution 2:', timeit(u11_2, number=5))
    print('Solution 3:', timeit(u11_3, number=5))
    

    输出:

    Solution 1: 0.007374127670871819
    Solution 2: 0.05485127553865618
    Solution 3: 0.05787154087587698
    

    所以第一个解决方案是最快的,使用发电机。

        2
  •  2
  •   Akash Ranjan    4 年前

    我试着用 df.apply

    >>> df.apply(lambda x: x['a'].join(x['b']), axis=1)
    0    haealalao
    1      gbobobd
    2    gcrcecact
    3      ndidcde
    dtype: object
    

    为性能比较计时,

    from timeit import timeit
    df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
    
    def u11_1():
        it = iter(df['a'])
        df['b'] = [next(it).join(i) for i in df['b']]
    
    def u11_2():
        df['b'] = df.groupby(df.index).apply(lambda x: x['a'].item().join(x['b'].item()))
    
    def u11_3():
        df['b'] = [x.join(y) for x, y in df.values.tolist()]
    
    def u11_4():
        df['c'] = df.apply(lambda x: x['a'].join(x['b']), axis=1)
    
    df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
    print('Solution 1:', timeit(u11_1, number=5))
    df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
    print('Solution 2:', timeit(u11_2, number=5))
    df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
    print('Solution 3:', timeit(u11_3, number=5))
    df = pd.DataFrame({'a': ['a', 'b', 'c', 'd'], 'b': ['hello', 'good', 'great', 'nice']})
    print('Solution 4:', timeit(u11_4, number=5))
    

    注意,我在每一行之前重新初始化df,以便所有函数都处理相同的数据帧。也可以将df作为参数传递给函数。

        3
  •  2
  •   Mayank Porwal    4 年前

    zip list comprehension . 应该比 df.apply :

    In [1576]: df.b = [i.join(j) for i,j in zip(df.a, df.b)]
    
    In [1578]: df
    Out[1578]: 
       a          b
    0  a  haealalao
    1  b    gbobobd
    2  c  gcrcecact
    3  d    ndidcde