【问题标题】:Data cleaning: How to index a Series value and deal with duplicate values indices in Python?数据清理:如何在 Python 中索引 Series 值并处理重复值索引?
【发布时间】:2017-05-07 15:16:58
【问题描述】:

我是 Python 3.x 的新用户,并尝试在数据清理代码方面获得一些帮助。

Here是模拟数据:

我有一个客户订单数据库,必须清理 UserPhone 列。在此列中,值可以是 str (ie: 0909111111, 0909.111.111) or number (ie: 909111111, 909111111.0, 84909111111)

我希望结果是:909111111

为此,我必须:

  1. 从所有值中删除'.0'
  2. 从所有值中删除所有非数字字符(空格、文本,如果有)
  3. 如果值以“0”开头,则删除“0”
  4. 如果值以“84”开头,则删除“84”

我猜这 4 个步骤具有相同的结构。例如,为了解决任务 2,我尝试编写如下代码:

import pandas as pd
test=pd.read_excel('D:/relay-foods.xlsx')
b=test['UserPhone']
for i in test['UserPhone']:
    if i:
        i = str(i)
        for j in i:
            if not j.isdigit():
                index_i=test.index(i)
                i = i.replace(j, '')
                b[index_i]=i

但它会导致错误 TypeError: 'RangeIndex' object is not callable 我搜索并意识到 index(i) 仅适用于 List 而 'UserPhone' 是 Series 类型。我试过test['UserPhone']=test['UserPhone'].tolist(),但它不起作用。有人可以帮我解决这个问题吗?

另外一件值得注意的事情是,“UserPhone”包含重复项,这可能导致不同行中相同“UserPhone”值的相同索引。

非常感谢您的帮助!

【问题讨论】:

  • 试试test['UserPhone'] = test['UserPhone'].astype(str).str.replace('0.|^0|^84|[^0-9]+','').astype(int)。如果您希望输出保持为字符串,则可以取出 .astype(int)

标签: python-3.x indexing duplicates series


【解决方案1】:

我根据@Abdou 的代码进行了编辑,此代码有效:

test['UserPhone'] = test['UserPhone'].astype(str).str.replace('\.0|^0|^84|[^0-9]+‌​','')

唯一不同的是\.0而不是.0,因为点(.)是一个元字符,我们必须在它前面加上一个'\'来消除它的特殊含义。 再次感谢@Abdou!

【讨论】:

  • 这看起来不错。您可以将$ 添加到\.0 以确保它仅捕获电话号码末尾的“.0”。
【解决方案2】:

尝试将UserPhone 列转换为字符串列,然后使用.str.replace 方法替换满足您概述的条件的任何内容。以下应该做:

test['UserPhone'] = test['UserPhone'].astype(str).str.replace('\.0$|^0|^84|[^0-9]+‌​','').astype(int)

对于此处提供的模式:

\.0$ 匹配电话号码末尾的“.0”;

^0 匹配电话号码开头的任何零;

^84 匹配电话号码开头的任何“84”;

[^0-9]+‌​ 匹配一个或多个不是数字的字符。

| 运算符等效于 OR

此外,如果您希望输出保持为字符串,请随时从代码中删除 .astype(int) 部分。

我希望这会有所帮助。

【讨论】:

  • 感谢您的回答。它比我想象的要短得多,但是代码存在一些问题:首先,它无法删除空格。然后,我想删除值末尾的.0,而不是0.。我试图编辑您的代码,但它不起作用。最后,它以某种方式从每个以09 开头的字符串中删除09,而不仅仅是0。你能帮我解决这个问题吗?
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多