2016-01-09 15 views
5

Ho un set di dati simile al seguente. Abbiamo solo dati per l'ultimo giorno di un mese che sto cercando di interpolare per il resto, è il modo giusto di farlo?Python panda il dataframe interpola dati mancanti

Date Australia China 
2011-01-01 NaN NaN 
2011-01-02 NaN NaN 
-   -  - 
-   -  - 
2011-01-31 4.75 5.81 
2011-02-01 NaN NaN 
2011-02-02 NaN NaN 
-   -  - 
-   -  - 
2011-02-28 4.75 5.81 
2011-03-01 NaN NaN 
2011-03-02 NaN NaN 
-   -  - 
-   -  - 
2011-03-31 4.75 6.06 
2011-04-01 NaN NaN 
2011-04-02 NaN NaN 
-   -  - 
-   -  - 
2011-04-30 4.75 6.06 

Per interpolare questo dataframe per trovare i valori NaN mancanti Sto usando il seguente codice

import pandas as pd 
df = pd.read_csv("data.csv", index_col="Date") 
df.index = pd.DatetimeIndex(df.index) 
df.interpolate(method='linear', axis=0).ffill().bfill() 

Ma sto ottenendo un errore "TypeError:. Non è possibile interpolare con tutto NaN"

Cosa potrebbe esserci di sbagliato qui, come posso risolvere questo problema?

Grazie.

+0

L'errore è abbastanza auto-esplicativo. Puoi provare a rilasciare NaN come descritto in questo http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html – station

+0

Ciao, grazie per l'aiuto, ma invece dei NaN cosa posso compilare quelle file? – Unnikrishnan

+0

@Unnikrishnan sono già state fornite buone risposte, penso. I tuoi dati sono piuttosto scarsi, quindi ti consigliamo di chiedersi se sia una buona idea in realtà interpolare tali enormi quantità di dati. Sei sicuro che quei valori saranno in qualche modo corretti? –

risposta

4

Si può cercare di convertire dataframe a float da astype:

import pandas as pd 

df = pd.read_csv("data.csv", index_col=['Date'], parse_dates=['Date']) 

print df 

      Australia China 
Date       
2011-01-31  4.75 5.81 
2011-02-28  4.75 5.81 
2011-03-31  4.75 6.06 
2011-04-30  4.75 6.06 

df = df.reindex(pd.date_range("2011-01-01", "2011-10-31"), fill_value="NaN") 

#convert to float 
df = df.astype(float) 

df = df.interpolate(method='linear', axis=0).ffill().bfill() 
print df 

      Australia China 
2011-01-01  4.75 5.81 
2011-01-02  4.75 5.81 
2011-01-03  4.75 5.81 
2011-01-04  4.75 5.81 
2011-01-05  4.75 5.81 
2011-01-06  4.75 5.81 
2011-01-07  4.75 5.81 
2011-01-08  4.75 5.81 
2011-01-09  4.75 5.81 
2011-01-10  4.75 5.81 
2011-01-11  4.75 5.81 
2011-01-12  4.75 5.81 
2011-01-13  4.75 5.81 
2011-01-14  4.75 5.81 
2011-01-15  4.75 5.81 
2011-01-16  4.75 5.81 
2011-01-17  4.75 5.81 
2011-01-18  4.75 5.81 
2011-01-19  4.75 5.81 
2011-01-20  4.75 5.81 
2011-01-21  4.75 5.81 
2011-01-22  4.75 5.81 
2011-01-23  4.75 5.81 
2011-01-24  4.75 5.81 
2011-01-25  4.75 5.81 
2011-01-26  4.75 5.81 
2011-01-27  4.75 5.81 
2011-01-28  4.75 5.81 
2011-01-29  4.75 5.81 
2011-01-30  4.75 5.81 
...    ... ... 
2011-10-02  4.75 6.06 
2011-10-03  4.75 6.06 
2011-10-04  4.75 6.06 
2011-10-05  4.75 6.06 
2011-10-06  4.75 6.06 
2011-10-07  4.75 6.06 
2011-10-08  4.75 6.06 
2011-10-09  4.75 6.06 
2011-10-10  4.75 6.06 
2011-10-11  4.75 6.06 
2011-10-12  4.75 6.06 
2011-10-13  4.75 6.06 
2011-10-14  4.75 6.06 
2011-10-15  4.75 6.06 
2011-10-16  4.75 6.06 
2011-10-17  4.75 6.06 
2011-10-18  4.75 6.06 
2011-10-19  4.75 6.06 
2011-10-20  4.75 6.06 
2011-10-21  4.75 6.06 
2011-10-22  4.75 6.06 
2011-10-23  4.75 6.06 
2011-10-24  4.75 6.06 
2011-10-25  4.75 6.06 
2011-10-26  4.75 6.06 
2011-10-27  4.75 6.06 
2011-10-28  4.75 6.06 
2011-10-29  4.75 6.06 
2011-10-30  4.75 6.06 
2011-10-31  4.75 6.06 

[304 rows x 2 columns] 

E si può omettere ffill(), perché NaN sono solo in prime righe della dataframe:

df = df.interpolate(method='linear', axis=0).ffill().bfill() 
012.

a:

df = df.interpolate(method='linear', axis=0).bfill() 
+0

Grazie mille, funziona come previsto! – Unnikrishnan

1

È possibile provare a eliminare NaN dall'insieme di dati prima dell'interpolazione.

import pandas as pd 
df = pd.read_csv("data.csv", index_col="Date") 
df = df.dropna() 
df.index = pd.DatetimeIndex(df.index) 
df.interpolate(method='linear', axis=0).ffill().bfill() 
+0

Quelle righe NaN non erano in CSV l'ho aggiunto usando il codice df = df.reindex (pd.date_range ("2011-01-01", "2011-10-31"), fill_value = np.nan). come posso riempire quelle file? – Unnikrishnan

Problemi correlati