【问题标题】:Replacing letters with numbers in python objects用python对象中的数字替换字母
【发布时间】:2020-01-31 19:15:06
【问题描述】:

我正在尝试在 Pandas DataFrame 中用数字替换 python 对象的所有字母。

示例:我有一列包含 3000 个课程代码,例如。 A0101P。我试图用相应的数字(A = 1,B = 2 等)替换课程代码中的所有字母,所以输出看起来像这样“1010116”(最重要的是,是一个整数而不是一个对象/字符串)

课程代码最初是一个 python 对象。所以我用过

course.to_string()

将其更改为字符串值。

然后,我创建了一个映射,然后使用 str.replace 替换值。

mapping = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q":17,"R":18, "S": 19, "T": 20,"U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z":26}

courseDone = course.str.replace(course["Cursus code"], mapping)

它会引发错误

AttributeError: 'str' object has no attribute 'str'

我也试过了

for key, value in mapping.items():
    course = course.replace(key, value)

它会引发错误

TypeError: replace() argument 2 must be str, not int

即使数据类型是字符串。

示例数据:

1       A0101P
2       A0111P
3       A0200P
4       A0201P
5       A0202P

期望的输出:

1       1010116
2       1011116
3       1020016
4       1020116
5       1020216

我也尝试使用 str() 更改数据类型,最终错误是相同的。

当我使用时

for key, value in mapping.items():
    course["Cursus code"] = course["Cursus code"].replace(key, value)

我没有收到错误,但输出保持不变。

我是 python 新手,我已尽力寻找解决方案,但似乎没有任何效果。 谁能帮帮我?

【问题讨论】:

  • 请改用course.replace(course["Cursus code"], mapping)。并将 str 值放入您的映射中:{"A": "1", "B": "2", "C": "3", "D": "4", ...} 最后将结果转换为int
  • "课程代码最初是一个 python 对象。所以我使用 course.to_string() 将其更改为字符串值。"字符串是 Python 中的对象。你的意思是course 是pandas.Dataframe?

标签: python python-3.x string pandas


【解决方案1】:

一个愚蠢的解决方案是一个接一个地替换字母,类似于你的,但必须将数字映射到字符串:

for k,v in mapping.items():
    v = str(v)
    course["Cursus code"] = course["Cursus code"].str.replace(k,v)

输出:

0    1010116
1    1011116
2    1020016
3    1020116
4    1020216

【讨论】:

  • 感谢您的回答!我选择了这个答案,因为它对我来说是最容易理解的并且它确实有效。理论上其他答案应该有效,但由于某种原因没有。
【解决方案2】:

字符串在 pandas 中被保存为“对象”。您可以使用数据框的 info() 方法来查看哪些列是整数、对象(用于字符串)、时间戳等,例如:

df.info()

至于您的问题,您可以使用 apply 方法并将您的字符串替换为所需的映射,如下所示:

def str_to_int_map(string, mapping):

   return int(''.join([str(mapping.get(x, x)) for x in string]))
mapping = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q":17,"R":18, "S": 19, "T": 20,"U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z":26}
df['Course'] = df['Course'].apply(lambda x: str_to_int_map(x, mapping))

【讨论】:

  • 感谢您的解释,我实际上在我的初始 df 上使用了 df.info() 并且数据类型是对象。然后,我使用了 to_string(),当再次使用 .info() 检查时,我收到一个错误 AttributeError: 'str' object has no attribute 'info',因此我假设它是一个完全不同的类型。
  • .info 适用于 pandas 数据框对象。 info() 因为它是 pandas 数据框对象的内置方法。您不能将此方法用于字符串对象
【解决方案3】:

您也可以使用 map 将值替换为 dict,它非常干净。 那么关于你的字符串问题,是不是因为你没有分配你的结果?

喜欢: course = course.to_string() courseDone = course.str.replace(course["Cursus code"], mapping)

或

courseDone = course.to_string().str.replace(course["Cursus code"], mapping)

【讨论】:

    【解决方案4】:

    以下示例类似于您当前的结构。但是有很多方法可以做到这一点。根据需要展开映射。还要注意,在 Python 2/3 中迭代 dict 是不同的。请注意,键和值都是字典中的字符串。

    string_to_change = 'abc123'
    mapping_dict = dict(zip(['a','b','c'],['1','2','3']))
    for k, v in mapping_dict.iteritems():
        string_to_change = string_to_change.replace(k,v)
    '''
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多