当Na存在时,用等效字母替换矩阵中的所有数字

时间:2018-05-30 17:49:55

标签: python string pandas sequence

有一个巨大的矩阵,其元素是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个元素。

3 个答案:

答案 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