python - 如何处理 CSV 文件中 DECIMAL 列的缺失值

标签 python sql-server pandas null pyodbc

我正在使用 pyodbc 从 .csv 文件将数据读取到数据库。

在 SQL Server 中,有一列定义为 decimal(18,4),但该列中缺少值。因此,当我尝试插入它时,它会抛出一个错误,指出字符串类型无法转换为数字类型。

数据看起来像

[A, B, C, , 10, 10.0, D, 10.00]

正如您在位置 4 处看到的,有一个缺失值 '',它应该是像 4.3526 这样的 float

我想将此行读取到数据库,其中第 4 列定义为 decimal(18,4),它应该看起来像

A B C NULL 10 10.0 D 10.00

在数据库中。

编辑:

这是我的代码

def load_data(c, infile, num_rows = None, db_schema = 'dbo',table_name = 'new_table'):

try:
    if num_rows:
        dat = pd.read_csv(infile, nrows = num_rows)
    else:
        dat = pd.read_csv(infile)

    l = dat.shape[1]
    c.executemany('INSERT INTO {}.{} VALUES {}'.format(db_schema,table_name,'(' + ', '.join(['?']*l) + ')'), dat.values.tolist())

except :
    with open(infile) as f:
        dat = csv.reader(f)
        i = 0
        for row in dat:
            if i == 0:
                l = len(row)
            else:
                c.execute('INSERT INTO {}.{} VALUES {}'.format(db_schema,table_name,'(' + ', '.join(['?']*l) + ')'), *row)

            if num_rows:
                if i == num_rows:
                    break
            i += 1

print(db_schema + '.' + table_name+' inserted successfully!')

请忽略缩进错误。

谢谢。

最佳答案

如果 Pandas 'read_csv方法为缺失值返回一个空字符串,那么您的 CSV 文件很可能使用“标点符号样式”逗号分隔符(逗号后有一个空格)而不是“严格”逗号分隔符(没有多余的空格)。

考虑“严格”的 CSV 文件

1,,price unknown
2,29.95,standard price

pandas 代码

df = pd.read_csv(r"C:\Users\Gord\Desktop\no_spaces.csv", header=None, prefix='column')
print(df)

产生

   column0  column1         column2
0        1      NaN   price unknown
1        2    29.95  standard price

缺失值被解释为 NaN(不是数字)。

但是,如果 CSV 文件包含

1, , price unknown
2, 29.95, standard price

然后产生相同的代码

   column0 column1          column2
0        1            price unknown
1        2   29.95   standard price

请注意,缺失值实际上是一个包含单个空格的字符串 (' ')。您可以使用 print(df.to_dict()) 来验证这一点。

如果您希望 read_csv 正确解析该 CSV 文件,您需要使用 sep=', ' 以便字段分隔符包含空格

df = pd.read_csv(r"C:\Users\Gord\Desktop\with_spaces.csv", header=None, prefix='column', sep=', ', engine='python')
print(df)

这再次给了我们

   column0  column1         column2
0        1      NaN   price unknown
1        2    29.95  standard price

关于python - 如何处理 CSV 文件中 DECIMAL 列的缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52862493/

相关文章:

sql - 为插入、修改和删除创建数据库触发器的正确​​语法是什么

python - 按函数分组后将值与先前值进行比较

python和mysql在表中插入值

Python Pandas : Going through a list of cycles and making point of interest

mysql - 如何使用where选择最旧或最新的日期?

python - Pandas 升级安装失败

python - 如何按名称获取列的索引?

python - 如何控制包含东亚字符的 Unicode 字符串的填充

python - sympy 的问题用数学方程解决(python)

sql - 重建数据库中的所有索引