Elegant way to create empty pandas DataFrame with NaN of type float
Asked Answered
A

6

110

I want to create a Pandas DataFrame filled with NaNs. During my research I found an answer:

import pandas as pd

df = pd.DataFrame(index=range(0,4),columns=['A'])

This code results in a DataFrame filled with NaNs of type "object". So they cannot be used later on for example with the interpolate() method. Therefore, I created the DataFrame with this complicated code (inspired by this answer):

import pandas as pd
import numpy as np

dummyarray = np.empty((4,1))
dummyarray[:] = np.nan

df = pd.DataFrame(dummyarray)

This results in a DataFrame filled with NaN of type "float", so it can be used later on with interpolate(). Is there a more elegant way to create the same result?

Appurtenance answered 5/5, 2015 at 12:44 Comment(1)
I had to put dummyarray = np.empty((4,1)) for me to workToadeater
C
144

Simply pass the desired value as first argument, like 0, math.inf or, here, np.nan. The constructor then initializes and fills the value array to the size specified by arguments index and columns:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame(np.nan, index=[0, 1, 2, 3], columns=['A', 'B'])

>>> df
    A   B
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN

>>> df.dtypes
A    float64
B    float64
dtype: object
Cilia answered 5/5, 2015 at 12:51 Comment(3)
Works for pd.Series too. Excellent!Joust
Replace np.nan by np.full(shape=(4,2),fill_value=np.nan) save running time! Test for 10000 rows and 10 for example.Ratio
@SayOL: I cannot confirm. %timeit df = pd.DataFrame(np.full(shape=(100_000,26), fill_value=np.nan), index=range(100_000), columns=range(26)) only slightly faster (1.63 ms/loop) compared to its simpler version (1.67 ms) on my machine. Which speedup do you observe with which exact setup?Cilia
M
14

You could specify the dtype directly when constructing the DataFrame:

>>> df = pd.DataFrame(index=range(0,4),columns=['A'], dtype='float')
>>> df.dtypes
A    float64
dtype: object

Specifying the dtype forces Pandas to try creating the DataFrame with that type, rather than trying to infer it.

Mullein answered 5/5, 2015 at 12:48 Comment(0)
G
7

Hope this can help!

 pd.DataFrame(np.nan, index = np.arange(<num_rows>), columns = ['A'])
Gauhati answered 20/6, 2018 at 10:24 Comment(0)
C
6

You can try this line of code:

pdDataFrame = pd.DataFrame([np.nan] * 7)

This will create a pandas dataframe of size 7 with NaN of type float:

if you print pdDataFrame the output will be:

     0
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
5   NaN
6   NaN

Also the output for pdDataFrame.dtypes is:

0    float64
dtype: object
Clarinda answered 28/1, 2019 at 6:40 Comment(0)
A
5

For multiple columns you can do:

df = pd.DataFrame(np.zeros([nrow, ncol])*np.nan)
Arthralgia answered 26/8, 2019 at 14:2 Comment(0)
F
0

You can also just pass an empty dictionary with repetition.

df= pd.DataFrame([{}]*4, columns=['A'])
Farrington answered 2/8, 2023 at 19:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.