如何识别熊猫中的虚拟数据并删除?



是否有一种方法可以识别数据框架中的虚拟数据并删除它们?在我下面的数据中,每一列都有随机字符需要删除。

import pandas as pd
import numpy as np
data = {'Name' : ['Tom', 'AABBCC', 'Joseph', 'Krish', 'XXXX', 'John', 'U'],
'Address1': ['High Street', 'uwdfjfuf', '00000', 'Green Lane', 'Kingsway', 'Church Street', 'iwefwfn'],
'Address2': ['Park Avenue', 'The Crescent', 'ABCXYZ', 'Highfield Road', 'Stanley Road', 'New Street', '1ca2s597']}
contact_details = pd.DataFrame(data)
#Code to identify and delete dummy data

print(contact_details)

以上代码的输出:

Name       Address1        Address2
0     Tom    High Street     Park Avenue
1  AABBCC       uwdfjfuf    The Crescent
2  Joseph          00000          ABCXYZ
3   Krish     Green Lane  Highfield Road
4    XXXX       Kingsway    Stanley Road
5    John  Church Street      New Street
6       U        iwefwfn        1ca2s597

你调查过你的数据吗?总是"好数据"。小写字母和大写字母的组合?如果是这样,您可以创建一个函数来查找这些虚拟数据,例如:

if text.lower() == text or text.upper() == text:
# text is dummy

如果不能很好地定义每个列的好值和坏值,就无法自动完成任务。有几个数据清理技巧可以让你更容易在大型数据集中找到这些值。

从原始数据集开始:

import pandas as pd
data = {'Name': ['Tom', 'AABBCC', 'Joseph', 'Krish', 'XXXX', 'John', 'U'],
'Address1': ['High Street', 'uwdfjfuf', '00000', 'Green Lane', 'Kingsway', 'Church Street', 'iwefwfn'],
'Address2': ['Park Avenue', 'The Crescent', 'ABCXYZ', 'Highfield Road', 'Stanley Road', 'New Street', '1ca2s597']}
contact_details = pd.DataFrame(data)

你可以做的第一件事是获取列的唯一值,以减少你要查找的值的数量。

# get all the unique values in the 'Name' column
names = contact_details['Name'].unique()

接下来,您可以对它们进行排序,以便更容易地突出任何接近重复的内容。在数据输入错误时经常发生近重复。

# sort them alphabetically and then take a closer look
names.sort()
print(list(names))

因此,例如,如果您已经看到值' Tom','Tom''Tom ',您知道您需要从名称中删除空白。

contact_details['Name'] = contact_details['Name'].strip()

对列中唯一值进行排序的另一个好处是,以数字开头的字符串值将全部位于列表的开头,小写字符串将在末尾排序。这使得您的几个'Address1值脱颖而出。

# get all the unique values in the 'Address1' column
address1 = contact_details['Address1'].unique()
address1.sort()
print(list(address1))

这给了我唯一值的列表:

['00000', 'Church Street', 'Green Lane', 'High Street', 'Kingsway', 'iwefwfn', 'uwdfjfuf']

目前还不清楚第一个值是否有效,但最后两个值看起来很可疑。如果我想删除这些,我可以通过选择Address1而不是的所有行来过滤它们在一个坏值列表中

contact_details_filtered = contact_details[~contact_details['Address1'].isin(['iwefwfn', 'uwdfjfuf'])]
print(contact_details_filtered)

输出如下:

Name       Address1        Address2
0     Tom    High Street     Park Avenue
2  Joseph          00000          ABCXYZ
3   Krish     Green Lane  Highfield Road
4    XXXX       Kingsway    Stanley Road
5    John  Church Street      New Street

第2行肯定是可疑的,第4行是可疑的,但我认为您已经了解了如何查找和删除看起来像占位符或只是坏数据的值。

最新更新