代码之家  ›  专栏  ›  技术社区  ›  Hadij dmeu

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

  •  2
  • Hadij dmeu  · 技术社区  · 6 年前

    有一个巨大的矩阵,其元素是1到15之间的数字。我想把矩阵转换成一个元素是字母的矩阵,这样1就变成了“a”,2就变成了“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 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    使用 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 :

    打印(a.stack().astype(int).add(96).apply(chr).sum(level=0))
    0平方米
    1个LFAA
    数据类型:对象
    
        2
  •  1
  •   Mohamed Thasin ah    6 年前

    试试这个,

    A.fillna(0,inplace=True)
    A.applymap(lambda x: (chr(int(x) + 96))).sum(axis=1).str.replace('`','')
    
    0    flmij
    1     lfaa
    dtype: object
    
        3
  •  1
  •   jvd10    6 年前

    可以用分类法。如果不仅仅是映射到单个字符,那么它很有用。

    import pandas as pd
    import numpy as np, numpy.random
    numpy.random.seed(1)
    A_int = pd.DataFrame(np.random.randint(1,16,10).reshape(2,5)) 
    A_int.iloc[1,4]= np.NAN
    
    int_vals = list(range(1,16))
    chr_vals = [chr(n+96) for n in int_vals]
    A_chr = A_int.apply(axis=0, func=lambda x: pd.Categorical(x, categories=int_vals, ordered=True).rename_categories(chr_vals))
    
    A_chr.apply(axis=1, func=lambda x: ''.join([str(i) for i in x[pd.notnull(x)]]))