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

2024-05-02 20:01:55 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法识别数据帧中的虚拟数据并将其删除?在我下面的数据中,我需要删除每列中的随机字符

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

Tags: 数据nameimportstreetdataasjohnpd
2条回答

如果没有对每一列的好值和坏值的良好定义,您实际上无法自动执行任何操作。有几个数据清理技巧可用于使这些值更容易在大型数据集中找到

从原始数据集开始:

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行是可疑的,但我认为您了解了如何查找和删除看起来像占位符或只是坏数据的值

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

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

相关问题 更多 >