数据清洗:如何索引一个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
。
为此,我必须:
- 从所有值中删除“.0”
- 从所有值中删除所有非数字字符(space,文本(如果有)
- 如果值以“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' 值生成相同的索引。
非常感谢您的帮助!
尝试将 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!
我是 Python 3.x 新用户,想在数据清理代码方面获得一些帮助。
Here为模拟数据:
我有一个客户订单数据库,必须清理 UserPhone 列。在此列中,值可以是 str (ie: 0909111111, 0909.111.111) or number (ie: 909111111, 909111111.0, 84909111111)
。
我想要的结果是:909111111
。
为此,我必须:
- 从所有值中删除“.0”
- 从所有值中删除所有非数字字符(space,文本(如果有)
- 如果值以“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' 值生成相同的索引。
非常感谢您的帮助!
尝试将 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!