有一个巨大的矩阵,其元素是1到15范围内的数字。我想将矩阵转换为元素为字母的矩阵,使得1变为" a",2变为&# 34; b"等等。最后,我想合并每一行并创建一个序列。举个简单的例子:
import pandas as pd
import numpy as np, numpy.random
numpy.random.seed(1)
A = pd.DataFrame (np.random.randint(1,16,10).reshape(2,5))
A.iloc[1,4]= np.NAN
A
# 0 1 2 3 4
#0 6 12 13 9 10.0
#1 12 6 1 1 NaN
如果数据集中没有Na,我会使用此代码:
pd.DataFrame(list(map(''.join, A.applymap(lambda n: chr(n + 96)).as_matrix())))
在这里,它给出了这个错误:
TypeError: ('integer argument expected, got float', 'occurred at index 4')
预期输出为:
0
0 flmij
1 lfaa
第一行应该有5个元素,第二行应该有4个元素。
答案 0 :(得分:2)
if-else
使用sum
条件:
df = pd.DataFrame(A.applymap(lambda n: chr(int(n) + 96) if pd.notnull(n) else '')
.values.sum(axis=1))
print (df)
0
0 flmij
1 lfaa
<强>详情:
print (A.applymap(lambda n: chr(int(n) + 96) if pd.notnull(n) else ''))
0 1 2 3 4
0 f l m i j
1 l f a a
print (A.applymap(lambda n: chr(int(n) + 96) if pd.notnull(n) else '').values)
[['f' 'l' 'm' 'i' 'j']
['l' 'f' 'a' 'a' '']]
print (A.applymap(lambda n: chr(int(n) + 96) if pd.notnull(n) else '').values.sum(axis=1))
['flmij' 'lfaa']
另一种解决方案:
print (A.stack().astype(int).add(96).apply(chr).sum(level=0))
0 flmij
1 lfaa
dtype: object
<强>详情:
重塑为Series
:
print (A.stack())
0 0 6.0
1 12.0
2 13.0
3 9.0
4 10.0
1 0 12.0
1 6.0
2 1.0
3 1.0
dtype: float64
转换为integer
s:
print (A.stack().astype(int))
0 0 6
1 12
2 13
3 9
4 10
1 0 12
1 6
2 1
3 1
dtype: int32
添加号码:
print (A.stack().astype(int).add(96))
0 0 102
1 108
2 109
3 105
4 106
1 0 108
1 102
2 97
3 97
dtype: int32
转换为letter
s:
print (A.stack().astype(int).add(96).apply(chr))
0 0 f
1 l
2 m
3 i
4 j
1 0 l
1 f
2 a
3 a
dtype: object
第一级MultiIndex
求和:
print (A.stack().astype(int).add(96).apply(chr).sum(level=0))
0 flmij
1 lfaa
dtype: object
答案 1 :(得分:1)
可以使用分类。如果你做的不仅仅是映射到单个字符,那么这很有用。
Copy
答案 2 :(得分:1)
试试这个,
A.fillna(0,inplace=True)
A.applymap(lambda x: (chr(int(x) + 96))).sum(axis=1).str.replace('`','')
0 flmij
1 lfaa
dtype: object