【问题标题】:How to row-wise concatenate several columns containing strings?如何按行连接包含字符串的几列?
【发布时间】:2017-01-27 01:32:31
【问题描述】:

我有一系列特定的数据集,一般形式如下:

import pandas as pd
import random
df = pd.DataFrame({'n': random.sample(xrange(1000), 3), 't0':['a', 'b', 'c'], 't1':['d','e','f'], 't2':['g','h','i'], 't3':['i','j', 'k']})

tn 列的数量(t0, t1, t2 ... tn因数据集而异,但始终为 tn 列的内容,以便实现这个结果(请注意,为了便于阅读,我需要保留元素之间的空格):

df['result'] = df.t0 +' '+df.t1+' '+df.t2+' '+ df.t3

到目前为止一切顺利。这段代码可能很简单,但一旦我收到另一个数据集,它就会变得笨拙和不灵活,其中 tn 列的数量会增加。这就是我的问题所在:

是否有任何其他语法可以跨多个列合并内容?与数字列无关的东西,类似于:

df['result'] = ' '.join(df.ix[:,1:])

基本上我想实现与下面链接中的 OP 相同,但字符串之间有空格: R - concatenate row-wise across specific columns of dataframe

【问题讨论】:

标签: python pandas dataframe multiple-columns string-concatenation


【解决方案1】:

在字符串的列(系列)中操作大量的关键是Series.str访问器。

我可以想出两个.str 方法来做你想做的事。

str.cat()

第一个是str.cat。你必须从一个系列开始,但你可以传递一个系列列表(不幸的是你不能传递一个数据框)来连接一个可选的分隔符。使用您的示例:

column_names = df.columns[1:]  # skipping the first, numeric, column
series_list = [df[c] for c in column_names[1:]]
# concatenate:
df['result'] = series_list[0].str.cat(series_list[1:], sep=' ')

或者,在一行中:

df['result'] = df[df.columns[1]].str.cat([df[c] for c in df.columns[2:]], sep=' ')

str.join()

第二个是.str.join()方法,它的工作方式类似于标准的Python方法string.join(),但是你需要有一列(Series)iterables,例如一列元组,我们可以得到通过将tuples 按行应用于您感兴趣的列的子数据框:

tuple_series = df[column_names].apply(tuple, axis=1)
df['result'] = tuple_series.str.join(' ')

或者,在一行中:

df['result'] = df[df.columns[1:]].apply(tuple, axis=1).str.join(' ')

顺便说一句,不要用list 而不是tuple 尝试上述方法。从pandas-0.20.1 开始,如果传递给Dataframe.apply() 方法的函数返回list 并且返回的列表具有与原始(子)数据框的列相同的条目数,则Dataframe.apply() 将返回Dataframe Series.

【讨论】:

    【解决方案2】:

    这是一个稍微替代的解决方案:

    In [57]: df['result'] = df.filter(regex=r'^t').apply(lambda x: x.add(' ')).sum(axis=1).str.strip()
    
    In [58]: df
    Out[58]:
         n t0 t1 t2 t3   result
    0   92  a  d  g  i  a d g i
    1  916  b  e  h  j  b e h j
    2  363  c  f  i  k  c f i k
    

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 2019-11-12
      • 2011-04-18
      • 2020-07-16
      相关资源
      最近更新 更多