如何在处理列的其余部分时将导致错误的数据插入到单独的文件中?

Posted

技术标签:

【中文标题】如何在处理列的其余部分时将导致错误的数据插入到单独的文件中?【英文标题】:How to insert the data that's causing an error, into a separate file, while processing the rest of the column? 【发布时间】:2019-09-26 04:12:42 【问题描述】:

我正在编写一个处理超过 2000 万行和超过 50 列数据的程序。我正在尝试检查其中一列中的数字是偶数还是奇数。

如果是偶数,则将“E”插入不同的列;如果奇数,则在列中插入“O”。

DF_FILE_IN = pd.read_csv('3MB_2.txt',chunksize=1000,sep='\t',dtype=str,engine='c',header=0,encoding='latin-1')
out_fields = ['HSNBR','OEFLAG']

for DF_FILE in DF_FILE_IN:
    df_out1 = pd.DataFrame(dtype='str',columns=out_fields)
    df_out1['HSNBR'] = DF_FILE['ANumber'].map(lambda x: f'x:0>6')

    df_out1.loc[pd.to_numeric(df_out1['HSNBR']).map(lambda x: (x % 2 == 0) & (x != 0)), 'OEFLAG'] = 'E'
    df_out1.loc[pd.to_numeric(df_out1['HSNBR']).map(lambda x: (x % 2 != 0) & (x != 0)), 'OEFLAG'] = 'O'

但有些数据有字母、符号、空格等

当我运行它时,这行代码会弹出一个错误: df_out1.loc[pd.to_numeric(df_out1['HSNBR']).map(lambda x: (x % 2 == 0) & (x != 0)), 'OEFLAG'] = 'E'

并说(示例):

ValueError: Unable to parse string "111 1/2g" at position 10

我正在使用分块来提取数据(例如,一次 100 万行)。我想将导致错误的数据放入单独的文件中。但是当我使用try except 时,它不会处理该块中的数据列。

如何将数据和错误放入文件中,同时让程序继续处理列?

【问题讨论】:

如果它们是单独的文件,请使用 try except 块来捕获 ValueErrors 以进行不同的管理。根据您的代码,它不显示块或加载部分 @BernardL 我添加了更多代码以进行澄清。 我认为最好的方法是编写一个函数,当操作失败时返回任意值。然后你就会知道哪一行是错误的。 【参考方案1】:

@BernardL 的意思是写这样一个函数:

def even_odd(x):
    x = str(x)
    if x.isnumeric():
        x = int(x)
        if (x % 2 == 0) and (x != 0):
            return 'E'
        if (x % 2 != 0) and (x != 0):
            return 'O'
    return 'error' 

然后应用它:

df_out1['OEFLAG'] = df_out1['HSNBR'].map(even_odd)

然后您可以通过以下方式排除错误:

df_out1[df_out1['OEFLAG'] == 'error'].to_csv('errors_file.csv')
df_out1 = df_out1[df_out1['OEFLAG'] != 'error']

【讨论】:

以上是关于如何在处理列的其余部分时将导致错误的数据插入到单独的文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将火花数据输出到具有单独列的 csv 文件?

在预编译项目/库的其余部分时动态编译App_Code中的类

在操作中为请求的其余部分设置文化

向 SQL 插入数据时由于科学记数法导致的错误

将 CSS 部署与站点的其余部分分开

哈希键列的隐式转换导致插入速度非常慢