2016-01-09 31 views
5

Mam zestaw danych, jak poniżej. Mamy tylko dane na ostatni dzień miesiąca, próbuję interpolować resztę, czy jest to właściwy sposób na zrobienie tego?Python pandas imageframe interpolate brakujące dane

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 

Dla interpolować to dataframe znaleźć brakujących wartości NaN Używam następujący kod

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() 

Ale otrzymuję błąd „Błąd typu:. Nie można interpolacji ze wszystkimi Nans”

Co może być nie tak, jak mogę to naprawić?

Dzięki.

+0

Błąd jest dość oczywisty. Możesz spróbować, upuszczając NaN, jak na ten http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html – station

+0

Witam, dziękuję za pomoc, ale zamiast NaNs, co mogę wypełnić te rzędy? – Unnikrishnan

+0

@Unnikrishnan dobre odpowiedzi już zostały podane, myślę. Twoje dane są dość skąpe, więc możesz zapytać, czy dobrze jest właściwie interpolować tak ogromne ilości danych. Na ile jesteś pewien, że te wartości będą nieco poprawne? –

Odpowiedz

4

Można spróbować przekształcić dataframe do float przez 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] 

I można pominąć ffill(), ponieważ NaN są tylko w pierwszych rzędach dataframe:

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

do:

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

Dziękuję bardzo, działa zgodnie z oczekiwaniami! – Unnikrishnan

1

Możesz spróbować upuścić NaN z zestawu danych przed interpolacją.

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

Te wiersze NaN nie znajdowały się w CSV Dodałem je, używając kodu df = df.reindex (pd.date_range ("2011-01-01", "2011-10-31"), fill_value = np.nan) .Otherwise jak mogę wypełnić te wiersze? – Unnikrishnan