数据清洗:如何索引一个Series值并处理Python中的重复值索引?

Data cleaning: How to index a Series value and deal with duplicate values indices in Python?

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

Here为模拟数据:

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

我想要的结果是:909111111

为此,我必须:

  1. 从所有值中删除“.0”
  2. 从所有值中删除所有非数字字符(space,文本(如果有)
  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' 值生成相同的索引。

非常感谢您的帮助!

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

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

对于此处提供的模式:

\.0$ 匹配 phone 数字末尾的“.0”;

^0 匹配 phone 数字开头的任何零;

^84 匹配 phone 数字开头的任何“84”;

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

| 运算符等同于 OR.

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

希望对您有所帮助。

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

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

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