如何在每列的熊猫数据框中找到不合适的数据类型?

时间:2019-12-17 15:19:11

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

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并没有捕获所有错误。我不知道该怎么走?

2 个答案:

答案 0 :(得分:0)

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

我建议使用熊猫提供的内置方法来处理数据框。

例如,如果您有一个数据框 main ,则:

main.info()

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

因此,您的列 name 不能有任何其他内容,但您会错过的字符串。相反,您可以具有 NaN 值。您可以在

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

我希望对您有所帮助:-)

答案 1 :(得分:0)

这是使用df.eval()

的一种方法

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

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模式,但想法应该相同。