Python 具有相同周期数据的时间序列数据帧填充值
我有一个包含NaN值的数据框,我希望使用当月的信息填充缺少的数据 数据框如下所示:Python 具有相同周期数据的时间序列数据帧填充值,python,pandas,Python,Pandas,我有一个包含NaN值的数据框,我希望使用当月的信息填充缺少的数据 数据框如下所示: data = {'x':[208.999,-894.0,-171.0,108.999,-162.0,-29.0,-143.999,-133.0,-900.0], 'e':[0.105,0.209,0.934,0.150,0.158,'',0.333,0.089,0.189], } df = pd.DataFrame(data) df = pd.DataFrame(data, index =['20
data = {'x':[208.999,-894.0,-171.0,108.999,-162.0,-29.0,-143.999,-133.0,-900.0],
'e':[0.105,0.209,0.934,0.150,0.158,'',0.333,0.089,0.189],
}
df = pd.DataFrame(data)
df = pd.DataFrame(data, index =['2020-01-01', '2020-02-01',
'2020-03-01', '2020-01-01',
'2020-02-01','2020-03-01',
'2020-01-01','2020-02-01',
'2020-03-01'])
df.index = pd.to_datetime(df.index)
df['e'] =df['e'].apply(pd.to_numeric, errors='coerce')
现在我用
df=df.fillna(df['e'].mean())
来填充nan值,但它需要所有的列数据,它给我0.27
有没有办法只使用同一个月的数据?结果应该是0.56
尝试在index.month中分组,然后得到平均值(转换后的
)
df.index = pd.to_datetime(df.index)
out = df.fillna({'e':df.groupby(df.index.month)['e'].transform('mean')})
也许您可以使用
interpolate()
而不是fillna()
,但您必须首先对索引进行排序,即:
df.e.sort_index().interpolate()
输出:
2020-01-01 0.1050
2020-01-01 0.1500
2020-01-01 0.3330
2020-02-01 0.2090
2020-02-01 0.1580
2020-02-01 0.0890
2020-03-01 0.9340
2020-03-01 0.5615
2020-03-01 0.1890
Name: e, dtype: float64
默认情况下,使用线性插值,因此在出现一次NaN的情况下,您将获得平均值,缺失的值将替换为您预期的0.5615。但是,如果排序后当月的第一个样本是
NaN
,则结果将是上个月最后一个值和本月下一个值的平均值,但它适用于整月都有NaN
,且没有任何平均值的情况,因此,根据您对同一个月的要求有多严格,或者丢失的值在整个数据帧中的分布情况,您可以接受或不接受此解决方案。如果一个月的所有值都是NaNs
,那么该解决方案的正确数据填充方式可能是0I,它会删除只有NaNs
的行整整一个月。否则,插值可以用相当真实的值填充间隙。
2020-01-01 0.1050
2020-01-01 0.1500
2020-01-01 0.3330
2020-02-01 0.2090
2020-02-01 0.1580
2020-02-01 0.0890
2020-03-01 0.9340
2020-03-01 0.5615
2020-03-01 0.1890
Name: e, dtype: float64