Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在每个列的数据框中找到不合适的数据类型?_Python_Regex_Python 3.x_Pandas_Python 2.7 - Fatal编程技术网

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

Python 如何在每个列的数据框中找到不合适的数据类型?,python,regex,python-3.x,pandas,python-2.7,Python,Regex,Python 3.x,Pandas,Python 2.7,主要目的: 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

主要目的:

    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中查找数据类型错误值。例如,从列info df中,我们可以看到“Name”是一个字符串列,因此在主df中,“Name”列应该包含字符串或字母数字,而不是错误。我需要在单独的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没有捕捉到每一个错误。我不知道怎么走得更远

如果我理解您所做的,那么您创建了单独的数据帧,其中包含关于主数据帧的信息

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

例如,如果您有一个dataframe main,则:

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

因此,您的列名不能包含任何其他内容,而只能包含您可能会丢失的字符串。相反,可以使用NaN值。您可以在的帮助下检查它们

main.describe()
我希望这有帮助:-)

这里有一种使用

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


输出

    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
模式,但想法应该是一样的。

为什么
444
是无效的字符串数据类型?它以字符串或整数的形式有效。您应该读取,因为字符串列至少应该有一个字母表。您没有检查数据类型,这与数据类型无关。您只是想检查数据内容以及它们是否符合某些规则。浮点数据类型出现错误:类型错误:一元数错误的操作数类型:'float'浮点数据类型出现错误:类型错误:一元数错误的操作数类型:'float'可能是因为缺少值,但我确实排除了缺失的值,然后也出现了这个错误。我试图在字典中实现na=False。然后它没有名为“append”的属性。
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