将dataframe列中的字符串映射到数值

时间:2019-07-03 06:28:27

标签: python pandas dictionary series

大家好,

对于熊猫系列,我需要将字符串中的字符更改为数值,如下所示:

   Match      Team1      Team2     Winner
0      0  Australia    England  Australia
2      2      India  Australia  Australia
3      3    England      India    England

我尝试过mapping将数据框添加到字典中,但这仅考虑了整个字符串,而不是每个字符。然后我尝试将字符串映射到元组,然后再映射到字典,但这也没有用。

4 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

使用正则表达式。

例如:

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

答案 2 :(得分:1)

快速

str.replace与可调用

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

使用str.split扩展到列,并使用replaceagg将其连接回字符串:

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

答案 3 :(得分:0)

这可能不是最优雅的方法,但它应该可以工作。 您可以使用Python的内置replace()函数。

通过这种方式,您可以遍历列表,并对要替换的每个字符应用replace()函数。

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

这样,您将获得所描述的转换后的数据帧。

很抱歉格式化不正确。我在手机上输入了此信息,但是只要有计算机,我就会对其进行编辑。