如何逐行连接包含字符串的几个列?

时间:2016-09-19 11:14:08

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

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

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 因数据集而异,但始终为< ; 30。 我的目标是合并每行的 tn 列的内容,以便实现此结果(请注意,为了便于阅读,我需要保留元素之间的空白):

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

enter image description here

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

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

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

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

2 个答案:

答案 0 :(得分:3)

en mass 的字符串(系列)中操作的关键是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()类似,但是你需要有一个可迭代的列(系列),例如,一列元组,我们可以将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,并且返回的列表与原始(子)数据帧的列具有相同的编号条目,{{1 }}返回Dataframe.apply()而不是Dataframe

答案 1 :(得分: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