1

I have a Python dataframe with NULL value in some rows, while inserting to postgresql, some null in datetype column turns into 'NaT' string or 'NaN', I like it to be a real NULL , which is nothing in that cell.

sample dataframe before insert

enter image description here

import psycopg2
import pandas as pd
import numpy as np

conn=psycopg2.connect(dbname= 'myDB', host='amazonaws.com', 
port= '2222', user= 'mysuser', password= 'mypass')
cur = conn.cursor()

df= pd.DataFrame({ 'zipcode':[1,np.nan,22,88],'city':['A','h','B',np.nan]})


subset = df[['zipcode', 'city']]
data = [tuple(x) for x in subset.values]
records_list_template = ','.join(['%s'] * len(data)) 
insert_query = 'insert into public.MyTable (zipcode, city) values {}'.format(records_list_template)
cur.execute(insert_query, data)
conn.commit()

result in postgresql table

enter image description here

expected result below

enter image description here

2 Answers 2

3

You can convert NaN to None in this way:

df= pd.DataFrame({
    'zipcode':[1,np.nan,22,88],
    'city':['A','h','B',np.nan],
    'date':['2019-01-01','2019-01-02',pd.NaT,pd.NaT]})

df['date'] = [d.strftime('%Y-%m-%d') if not pd.isnull(d) else None for d in df['date']]

subset = df.where((pd.notnull(df)), None)

See DataFrame.where

Sign up to request clarification or add additional context in comments.

7 Comments

my bad, my actual table contains a datetype column which has some NaT, the df.where((pd.notnull(df)), None) can't convert NaT
Indeed, it does not work with NaT (I thought it should). I added a conversion from NaT to None in a specific column, see the updated answer.
by the way, do you know how to speed up the process if I have 1 millions rows to insert? Bulk insert?
Do you have the data in a file?
it's in pandas dataframe, I can save it as a csv.
|
2

Convert all instances of NaN in the dataframe by replacing with None, like this:

df = df.replace({pd.np.nan: None})

1 Comment

if you do this, than there will be 'None' in the postgres db. the OP wants to have [null] in the db

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.