【发布时间】: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。
为此,我必须:
- 从所有值中删除'.0'
- 从所有值中删除所有非数字字符(空格、文本,如果有)
- 如果值以“0”开头,则删除“0”
- 如果值以“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