Отображение строк в столбце данных в числовые значения - PullRequest
1 голос
/ 03 июля 2019

Добрый день всем,

Мне нужно изменить символы в строке на числовое значение для серии панд примерно так:

df = ['FF-FFF--FF+F-FFF',
     'F+-++--F+FF+-++-',
     'F++-FF-F-+F++-FF',
     'F+++++++++++++++',
     'F-F+-F-F+-F-F+-F',
     'F--F-+FFF+-FFF+-',
     'F+F-+F+F-+F+F-+F',
     'F--F--+-+++--F--',
     'F+FF--+FF--+FF--',
     'F-F+-+-F+-+-F+-+',
     'F++++-++++-++++-',
     'F+---++---++---+',
     'F+-+FF+-+FF+-+FF',
     'F+-FF-+-FF---+-F',
     'FF-+F+F-+F+F-+F+',
     'F+F+--+F+--+F+--',
     'FF+F-FFF---F+F-F',
     'FF+-FF-+---F+-FF',
     'F++--+++--+++--+']

num_dict = {'+':1, '-':2, 'F':3}

transformed_df = [3323332233132333,
                  3121122313312112,
                  3112332321311233,
                  3111111111111111,
                  3231232312323123,
                  3223213331233312,
                  3132131321313213,
                  3223221211122322,
                  3133221332213322,
                  3231212312123121,
                  3111121111211112,
                  3122211222112221,
                  3121331213312133,
                  3123321233222123,
                  3321313213132131,
                  3131221312213122,
                  3313233322231323,
                  3312332122231233,
                  3112211122111221]

Я пробовал отображение датафрейм в словаре, но он учитывает только всю строку, а не каждый символ.Затем я попытался отобразить строку в кортеж, а затем в словарь, однако это также не сработало.

Ответы [ 4 ]

4 голосов
/ 03 июля 2019

Вы можете сделать это с помощью dict.get():

s = pd.Series(df)
s.apply(lambda x: ''.join([str(num_dict.get(i)) for i in list(x)]))

0     3323332233132333
1     3121122313312112
2     3112332321311233
3     3111111111111111
4     3231232312323123
5     3223213331233312
6     3132131321313213
7     3223221211122322
8     3133221332213322
9     3231212312123121
10    3111121111211112
11    3122211222112221
12    3121331213312133
13    3123321233222123
14    3321313213132131
15    3131221312213122
16    3313233322231323
17    3312332122231233
18    3112211122111221
dtype: object

Примечание: если вы хотите, чтобы числа были числами, а не строками, вы можете позже сделать s=pd.to_numeric(s,errors='coerce')

1 голос
/ 03 июля 2019

Быстрый :

Использование str.replace с возможностью вызова

s.str.replace(r'\+|\-|F', lambda m: str(num_dict[m.group(0)]))

Медленный :

Использованиеstr.split для расширения до столбцов и replace, agg для присоединения к строке:

s.str.split('', expand=True).replace(num_dict).astype(str).agg(''.join, axis=1)

Out[296]:
0     3323332233132333
1     3121122313312112
2     3112332321311233
3     3111111111111111
4     3231232312323123
5     3223213331233312
6     3132131321313213
7     3223221211122322
8     3133221332213322
9     3231212312123121
10    3111121111211112
11    3122211222112221
12    3121331213312133
13    3123321233222123
14    3321313213132131
15    3131221312213122
16    3313233322231323
17    3312332122231233
18    3112211122111221
dtype: object
1 голос
/ 03 июля 2019

Использование Regex.

Ex:

import re    
num_dict = {'+':1, '-':2, 'F':3} 
pattern = re.compile("("+"|".join(re.escape(i) for i in num_dict) + ")")

df = pd.DataFrame({"Col": data})
df["Col"] = df["Col"].apply(lambda x: pattern.sub(lambda y: str(num_dict[y.group(1)]), x))
print(df)

Выход:

                 Col
0   3323332233132333
1   3121122313312112
2   3112332321311233
3   3111111111111111
4   3231232312323123
5   3223213331233312
6   3132131321313213
7   3223221211122322
8   3133221332213322
9   3231212312123121
10  3111121111211112
11  3122211222112221
12  3121331213312133
13  3123321233222123
14  3321313213132131
15  3131221312213122
16  3313233322231323
17  3312332122231233
18  3112211122111221
0 голосов
/ 03 июля 2019

Возможно, это не самый элегантный способ, но он должен работать.Вы можете использовать встроенную в Python функцию replace ().

Таким образом, вы можете бегать по списку и применять функцию replace () для каждого символа, который хотите заменить.

df_transformed = []
for line in df:
  df_transformed.append(int(line.replace('F', '3').replace('-', '2').replace('+', '1')))

таким образом вы получите преобразованный кадр данных, как вы описали.

И извините за плохое форматирование.Я набрал это на своем мобильном телефоне, но я отредактирую его, как только получу доступный компьютер.

...