【发布时间】:2017-03-22 10:17:13
【问题描述】:
我想插入一个数组,其中包含从 Python 中的 Pandas 创建的空值,这些空值默认为 Pandas 数据框中的 np.nan。我不希望它们在我的 PostgreSQL 数据库中成为“NaN”,我希望我的 PostgreSQL 数组包含如下的空值:'{123,24,,23}' 所以它们不计入我的聚合函数中,例如计算索引的平均值或标准差。我不确定 PostgreSQL 中是否可以有稀疏数组。我的数据集中不会有很多稀疏数组,我只是出于边缘情况的目的进行测试。
我的表架构:
create_table = '''
CREATE TABLE {t} (
patient_id VARCHAR[20] PRIMARY KEY,
gene_expression double precision []
);
'''
相关的 Python 代码(这里我不知道如何编写正确的 SQL 代码)。这里我把数组转换成字符串,因为Python数组不能稀疏:
df = df.fillna('')
NCI = [1]
MCI = [2,3]
AD = [4,5]
other = [6]
insert_sql = '''
INSERT INTO {t} (patient_id, gene_expression)
VALUES (%s,%s);
'''
cur = psql_conn.cursor()
for index, row in df.iterrows():
arr = row[2:].tolist()
postgres_arr = ','.join(map(str, arr))
if row['DIAGNOSIS'].isdigit():
if int(row['DIAGNOSIS']) in NCI:
cur.execute(insert_sql.format(t='nci'), (row['PATIENT_ID'], postgres_arr,))
elif int(row['DIAGNOSIS']) in MCI:
cur.execute(insert_sql.format(t='mci'), (row['PATIENT_ID'], postgres_arr,))
elif int(row['DIAGNOSIS']) in AD:
cur.execute(insert_sql.format(t='ad'), (row['PATIENT_ID'], postgres_arr,))
elif int(row['DIAGNOSIS']) in other:
cur.execute(insert_sql.format(t='other'), (row['PATIENT_ID'], postgres_arr,))
elif row['DIAGNOSIS'] == '':
cur.execute(insert_sql.format(t='na'), (row['PATIENT_ID'], postgres_arr,))
else:
print('ERROR: unknown diagnosis {d}.'.format(d=diagnosis))
psql_conn.commit()
cur.close()
我的错误:
psycopg2.DataError: malformed array literal: "{2.0,2.4,}"
LINE 3: VALUES ('X100_120417','{2.0,2.4,}');
^
DETAIL: Unexpected "}" character.
【问题讨论】:
标签: sql postgresql pandas numpy psycopg2