如何字符串连接一列与另一列

2024-09-28 22:24:42 发布

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

我刚刚遇到了这个问题,我如何通过一列连接另一列,这是我的{}:

>>> 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可能不是最好的例子,但您还可以执行其他功能。如果在其他列上使用splitsplit,或者用其他内容替换其他列中的字符,那么它可能会很有用

p.S.下面我有一个自我回答。


Tags: 示例内容hellodataframedfpdsplitgood
3条回答

下面是另一个使用ziplist 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

我尝试使用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作为参数传递给函数

TL;博士

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

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:

按索引分组,并applystr.join两列的值:

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

解决方案3:

使用list理解,在列和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

因此,第一种解决方案是最快的,使用生成器

相关问题 更多 >