如何在数据框中插值缺失数据

17
我有一个类似以下的数据集。我们只有每个月最后一天的数据,我正试图对其余的数据进行插值,这样做对吗?
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

为了插值这个数据框以找到缺失的NaN值,我使用以下代码。
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()

但是我遇到了一个错误:“TypeError: 无法使用所有NaN进行插值。”
这里可能出了什么问题?我该如何解决?

错误相当明显。您可以尝试按照此链接http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html删除NaN。 - station
嗨,谢谢你的帮助,但是除了NaNs,我可以在这些行中填写什么? - Unnikrishnan
1
@Unnikrishnan,我认为已经给出了很好的答案。你的数据非常稀疏,所以你可能需要质疑是否真的插值如此大量的数据是一个好主意。你有多确定这些值会是正确的? - Nelewout
2个回答

21
你可以尝试使用 astypedataframe 转换为 float :
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]

你可以省略 ffill(),因为 NaN 只出现在 dataframe 的第一行:

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

3
您可以在插值之前尝试从数据集中删除NaN。
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()

这些NaN行不在CSV文件中,我使用代码df = df.reindex(pd.date_range("2011-01-01", "2011-10-31"), fill_value=np.nan)添加了它们。否则,我该如何填充这些行呢? - Unnikrishnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接