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

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

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]

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

1
Zack Joubert 3 Июл 2019 в 09:28

4 ответа

Лучший ответ

Вы можете сделать это с помощью 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')

4
anky_91 3 Июл 2019 в 06:39

Используя Regex.

< Сильный > Пример:

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
1
Rakesh 3 Июл 2019 в 06:50

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

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

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

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

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

0
byTreneib 3 Июл 2019 в 06:51

< Сильный > Быстрый :

Используйте str.replace с вызываемым

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

< Сильный > Slow :

Используя 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
Andy L. 3 Июл 2019 в 08:42