【问题标题】:invalid literal for int() with base 10: 'EC180'基数为 10 的 int() 的无效文字:'EC180'
【发布时间】:2021-10-28 19:27:54
【问题描述】:

我尝试过的只是:

df['buyer_zip']=df['buyer_zip'].replace('-', 0)
df['buyer_zip']=df['buyer_zip'].replace('', 0)
df['buyer_zip']=df['buyer_zip'].str[:5]
df["buyer_zip"].fillna( method ='ffill', inplace = True)
df["buyer_zip"].apply(int)

我在名为 Buyer_zip 和 Item_zip 的 pandas 数据框中有两列,它们分别是买方和商品的邮政编码。这些邮政编码有 4 种格式。一个是 5 位邮政编码(例如:12345),一个是 5+4 位邮政编码(12345-1234),一个是 9 位邮政编码(123456789),最后一个是“EC180”。所以,最后一种格式是字母数字。总共有 1500 万条记录。我感到震惊,我必须将所有这些字母数字值转换为数字。当尝试做同样的事情时,我遇到了错误:int() 的无效文字,基数为 10:'EC180'。有人可以帮助我如何找到我的数据列中的所有单词并将其替换为 00000。感谢任何帮助。但没有一个给出如何找到该列中的单词并将其替换为数字的答案

样本数据:

buyer_zip 
97219 
11415-3528 
EC180
907031234

预期输出

     buyer_zip
0      97219
1  114153528
2          0
3  907031234

【问题讨论】:

  • 包括数据帧的样本和预期的输出。
  • 它有很多记录--1500万。所以无法附加任何东西
  • 请将您的问题从代码中提取出来。这让人无法知道你在问什么。
  • 1500 万张是相当多的。但是您有 4 种类型,那么 df 具有 1 列和 4 行怎么样。也许再多几行来显示您遇到问题的字母表的不同示例。
  • @tdelaney 请理解我并不是特别严格。 OP是一个新人,我已经为他设置了一个基础线。问一个好问题的做法真的是在帮助别人。此外,我不认为你更新预期的输出真的是 OP 想要的,他说字符串 "00000" 作为默认值......

标签: python pandas


【解决方案1】:

Pandas 有几种不同的“替换”方法。在DataFrameSeries 上,replace 意味着匹配和替换整个值。例如,df['buyer_zip'].replace('-', 0) 查找实际上是单个字符“-”的列值并将其替换为整数 0。这不是您想要的。该系列还有一个 .str 属性,其中包含字符串函数, replace 更接近您想要的。

但是,当你有一个以非数字字母开头的字符串时,就是。您希望将其完全替换为“00000”。

最后,astype 是一种将列转换为 int 的更快方法。

import pandas as pd

df = pd.DataFrame({"buyer_zip":["12345", "123451234", "123456789", "EC180"]})

df["buyer_zip"] = df["buyer_zip"].str.replace("-", "")
df["buyer_zip"] = df["buyer_zip"].replace(r"[^\d].*$", "00000", regex=True)
df["buyer_zip"] = df["buyer_zip"].astype(int)

这些操作可以链接起来。将第二个运算应用于第一个运算的结果,以此类推,您可以压缩转换

df["buyer_zip"] = df["buyer_zip"].str.replace("-", "").replace(r"[^\d].*$", "00000", regex=True).astype(int)

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 2018-03-13
    • 1970-01-01
    • 2021-06-25
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多