将任意数量的列合并为一个pandas中的列

时间:2015-09-02 18:17:57

标签: python pandas

此问题是询问here的具体案例的一般版本。

我有一个包含整数的pandas数据框。我想将所有这些整数连接成一列中的字符串。

给定this answer,对于特定列,这可行:

(dl['ungrd_dum'].map(str) +
 dl['mba_dum'].map(str) +
 dl['jd_dum'].map(str) +
 dl['ma_phd_dum'].map(str))

但是假设我有很多(数百个)这样的列,其名称在列表dummies中。我确信有一些很酷的pythonic方式可以用一条神奇的线来完成这一切。我已尝试将mapdummies一起使用,但尚未弄明白。

3 个答案:

答案 0 :(得分:3)

IIUC你应该能够做到

df[dummies].astype(str).apply(lambda x: ''.join(x), axis=1)

示例:

In [12]:

df = pd.DataFrame({'a':np.random.randint(0,100, 5), 'b':np.arange(5), 'c':np.random.randint(0,10,5)})
df
Out[12]:
    a  b  c
0   5  0  2
1  46  1  3
2  86  2  4
3  85  3  9
4  60  4  4
In [15]:

cols=['a','c']
df[cols].astype(str).apply(''.join, axis=1)
Out[15]:
0     52
1    463
2    864
3    859
4    604
dtype: object

修改

正如@JohnE所指出的那样你可以打电话给sum而不是更快:

df[cols].astype(str).sum(axis=1)

但是,这会隐式将dtype转换为float64,因此您必须再次转回str并在必要时将小数点切掉:

df[cols].astype(str).sum(axis=1).astype(str).str[:-2]

答案 1 :(得分:1)

from operator import add
reduce(add, (df[c].astype(str) for c in cols), "")

例如:

df = pd.DataFrame({'a':np.random.randint(0,100, 5), 
                   'b':np.arange(5), 
                   'c':np.random.randint(0,10,5)})

cols = ['a', 'c']


In [19]: df
Out[19]: 
    a  b  c
0   6  0  4
1  59  1  9
2  13  2  5
3  44  3  1
4  79  4  4

In [20]: reduce(add, (df[c].astype(str) for c in cols), "")
Out[20]: 
0     64
1    599
2    135
3    441
4    794
dtype: object

答案 2 :(得分:1)

您需要做的第一件事就是尽可能高效地转换字符串数据帧中的数字数据帧:

dl = dl.astype(str)

然后,您处于相同的情况as this other question,并且可以使用与this answer中相同的Series.str访问者技术:

.str.cat()

使用str.cat()即可:

dl ['result'] = dl [dl.columns [0]]。str.cat([dl [c] for c in dl.columns [1:]],sep ='')

str.join()

要使用.str.join(),你需要一系列的迭代,比如元组。

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

请勿使用list而不是tuple来尝试上述内容,否则apply() methdo会返回Dataframe而数据框没有.strSeries这样的访问者。