此问题是询问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方式可以用一条神奇的线来完成这一切。我已尝试将map
与dummies
一起使用,但尚未弄明白。
答案 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
而数据框没有.str
像Series
这样的访问者。