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并没有捕获所有错误。我不知道该怎么走?
答案 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
模式,但想法应该相同。