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