【问题标题】:How to find inappropriate datatype in pandas data frame for each column?如何在熊猫数据框中为每一列找到不合适的数据类型?
【发布时间】:2020-04-10 03:09:29
【问题描述】:

main_df:

    Name    Age   Id     DOB
0   Tom     20   A4565  22-07-1993
1   nick    21   G4562  11-09-1996
2   krish   AKL  F4561  15-03-1997
3   636A    18   L5624  06-07-1995
4   mak     20   K5465  03-09-1997
5   nits    55   56541  45aBc
6   444     66   NIT    09031992

column_info_df:

   Column_Name  Column_Type
0   Name         string
1   Age          integer
2   Id           string
3   DOB          Date

如何从主 df 中找到数据类型错误值。例如,从列信息 df 我们可以看到“名称”是一个字符串列,因此在主 df 中,“名称”列应该包含字符串或字母数字,而不是它是一个错误。我需要在单独的 df 中找到这些数据类型错误值。

错误输出df:

   Column_Name   Current_Value   Exp_Dtype   Index_No.
0  Name             444           string        6
1  Age              444           int           2
2  Name            56441          string        6
0  DOB             4aBc           Date          5
0  DOB             09031992       Date          6

我试过这个:

for i,r in column_info_df.iterrows():
    if r['Column_Type'] == 'string':
          main_df[r['Column_Name']].loc[main_df[r['Column_Name']].str.match(r'[^a-z|A-Z]+')]
    elif r['Column_Type'] == 'integer':
          main_df[r['Column_Name']].loc[main_df[r['Column_Name']].str.match(r'[^0-9]+')]
    elif r['Column_Type'] == 'Date':

我卡在这里,因为这个 RE 没有捕捉到所有错误。我不知道如何更进一步?

【问题讨论】:

  • 为什么444 是无效的字符串数据类型?它可以作为字符串或整数有效。
  • 因为字符串列应该至少有一个字母。
  • 你没有检查数据类型,这与数据类型无关。您只是想检查数据内容以及它们是否符合某些规则。

标签: python regex python-3.x pandas python-2.7


【解决方案1】:

如果我理解您所做的,您创建了单独的数据框,其中包含有关您的主要数据框的信息。

我建议改为使用 pandas 提供的内置方法来处理数据帧。

例如,如果你有一个数据框main,那么:

main.info()

将为您提供每列的对象类型。请注意,一列只能包含一种类型,因为它是一个系列,它本身就是一个 ndarray。

因此,您的列 name 除了您可能会错过的字符串之外,不能有任何其他内容。相反,您可以使用 NaN 值。您可以在

的帮助下检查它们
main.describe()

希望对你有所帮助 :-)

【讨论】:

    【解决方案2】:

    这是df.eval()的一种使用方式,

    注意虽然这将根据模式进行检查并返回不匹配的值。但是,请注意,这无法检查有效类型,例如,如果日期列有一个看起来像日期但是无效日期的条目,则不会识别:

    d={"string":".str.contains(r'[a-z|A-Z]')","integer":".str.contains('^[0-9]*$')",
                                     "Date":".str.contains('\d\d-\d\d-\d\d\d\d')"}
    m=df.eval([f"~{a}{b}" 
       for a,b in zip(column_info_df['Column_Name'],column_info_df['Column_Type'].map(d))]).T
    

    final=(pd.DataFrame(np.where(m,df,np.nan),columns=df.columns)
                  .reset_index().melt('index',var_name='Column_Name',
                                value_name='Current_Value').dropna())
    final['Expected_dtype']=(final['Column_Name']
                             .map(column_info_df.set_index('Column_Name')['Column_Type']))
    print(final)
    

    输出

        index Column_Name Current_Value Expected_dtype
    6       6        Name           444         string
    9       2         Age           AKL        integer
    19      5          Id         56541         string
    26      5         DOB         45aBc           Date
    27      6         DOB      09031992           Date
    

    我同意这项工作可以有更好的regex 模式,但想法应该是一样的。

    【讨论】:

    • 浮点数据类型出现错误:TypeError:一元操作数类型错误〜:'float'
    • 浮点数据类型出现错误:TypeError:一元操作数类型错误〜:'float'可能是因为缺失值,但我确实排除了缺失值,然后它也会出现这个错误。我试图在字典本身中实现 ​​na = False。那么它抛出的字典没有名为'append'的属性。
    猜你喜欢
    • 2020-08-14
    • 2020-04-09
    • 1970-01-01
    • 2017-04-19
    • 2021-07-31
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多