заменить все числа в матрице эквивалентными буквами, когда существует Na - PullRequest
0 голосов
/ 30 мая 2018

Существует огромная матрица, элементы которой представляют собой числа в диапазоне от 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 ]

0 голосов
/ 30 мая 2018

Можно использовать категорический.Полезно, если вы делаете больше, чем просто сопоставление отдельных символов.

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)]]))
0 голосов
/ 30 мая 2018

попробуйте,

A.fillna(0,inplace=True)
A.applymap(lambda x: (chr(int(x) + 96))).sum(axis=1).str.replace('`','')

0    flmij
1     lfaa
dtype: object
0 голосов
/ 30 мая 2018

Использование 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 с:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...