将数据框列中的字符串映射到数值
Mapping strings in dataframe column to numerical values
大家好,
我需要将字符串中的字符更改为 pandas 系列的数值,如下所示:
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]
我已经尝试 mapping 将数据帧添加到字典中,但它只考虑整个字符串而不是每个字符。然后我尝试将字符串映射到元组,然后映射到字典,但这也不起作用。
您可以通过 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')
这可能不是最优雅的方式,但应该可行。
您可以使用 Python 的 built-in replace() 函数。
这样您可以 运行 遍历列表并对每个要替换的字符应用 replace() 函数。
df_transformed = []
for line in df:
df_transformed.append(int(line.replace('F', '3').replace('-', '2').replace('+', '1')))
这样您将获得您所描述的转换后的数据框。
对于格式不佳,我们深表歉意。我在我的手机上输入了这个 phone,但我会在我有可用的计算机后立即编辑它。
使用正则表达式。
例如:
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
快速:
将 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
大家好,
我需要将字符串中的字符更改为 pandas 系列的数值,如下所示:
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]
我已经尝试 mapping 将数据帧添加到字典中,但它只考虑整个字符串而不是每个字符。然后我尝试将字符串映射到元组,然后映射到字典,但这也不起作用。
您可以通过 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')
这可能不是最优雅的方式,但应该可行。 您可以使用 Python 的 built-in replace() 函数。
这样您可以 运行 遍历列表并对每个要替换的字符应用 replace() 函数。
df_transformed = []
for line in df:
df_transformed.append(int(line.replace('F', '3').replace('-', '2').replace('+', '1')))
这样您将获得您所描述的转换后的数据框。
对于格式不佳,我们深表歉意。我在我的手机上输入了这个 phone,但我会在我有可用的计算机后立即编辑它。
使用正则表达式。
例如:
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
快速:
将 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