Python 将任意数量的列合并为一列

Python 将任意数量的列合并为一列,python,pandas,Python,Pandas,这个问题是一个具体案例的一般版本 我有一个包含整数的列的数据框架。我想将所有这些整数连接成一列中的字符串 对于特定的柱,这项工作如下: (dl['ungrd_dum'].map(str) + dl['mba_dum'].map(str) + dl['jd_dum'].map(str) + dl['ma_phd_dum'].map(str)) 但假设我有数百个这样的专栏,它们的名字都在一个傻瓜列表中。我敢肯定,有一种很酷的蟒蛇式的方法,用一条神奇的线就能做到这一切。我试过用地图来做假人,但

这个问题是一个具体案例的一般版本

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

对于特定的柱,这项工作如下:

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

但假设我有数百个这样的专栏,它们的名字都在一个傻瓜列表中。我敢肯定,有一种很酷的蟒蛇式的方法,用一条神奇的线就能做到这一切。我试过用地图来做假人,但还没弄明白。

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)
但是,这将隐式地将数据类型转换为float64,因此您必须再次转换回str,并在必要时切掉小数点:

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

你应该能做到的

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)
但是,这将隐式地将数据类型转换为float64,因此您必须再次转换回str,并在必要时切掉小数点:

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

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
例如:

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

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

dl = dl.astype(str)
然后,您将处于相同的情况,并且可以使用与中相同的Series.str访问器技术:

.str.猫 使用您可以做到:

dl['result']=dl[dl.columns[0]].str.cat[dl[c]表示dl.columns[1:][]中的c,sep=''

str.join 要使用.str.join,您需要一系列的iterables,比如tuples

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

不要用list而不是tuple来尝试上述操作,否则apply methdo将返回一个数据帧,并且数据帧没有类似.str访问器的序列。

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

dl = dl.astype(str)
然后,您将处于相同的情况,并且可以使用与中相同的Series.str访问器技术:

.str.猫 使用您可以做到:

dl['result']=dl[dl.columns[0]].str.cat[dl[c]表示dl.columns[1:][]中的c,sep=''

str.join 要使用.str.join,您需要一系列的iterables,比如tuples

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

不要用list而不是tuple来尝试上面的方法,否则apply methdo将返回一个Dataframe,而dataframes没有类似.str访问器的系列。

事实上,您完全理解。谢谢。请记住,您可以使用.join而不是lambda x:.joinx。@DSM事实上,我有时会忘记当我不需要lambdaw时,为什么不在它们成为字符串时使用sum?df.astypestr.sumaxis=1@JohnE虽然这样做有效,但是数据类型被转换为float64,OP需要str,因此您必须再次将其转换回str,但是对于大型dfs,它可能会更快。事实上,您完全理解。谢谢。请记住,您可以使用.join而不是lambda x:.joinx。@DSM事实上,我有时会忘记当我不需要lambdaw时,为什么不在它们成为字符串时使用sum?df.astypestr.sumaxis=1@JohnE虽然这是可行的,但数据类型被转换为float64,OP想要str,所以你必须再次将其投射回str,但对于大型DFS来说可能更快。我已经为任何使用reduce投掷石块的人准备好了一个很好的锡箔护盾:我已经为任何投掷石块的人准备好了一个很好的锡箔护盾岩石在我使用减少:猫似乎是更快的我。Lambda在1次迭代中花费了大约3秒,而cat在同一次迭代中只花费了0.08秒。cat对我来说似乎更快。Lambda在1次迭代中花费了大约3秒,而cat在同一次迭代中仅花费了0.08秒。