我正在处理中间有空值的数据。我打算根据特定列 sales 的累计总和构建一个时间序列图。 sales 的累积总和条件: (1.) 如果第一行为空,fillna(0),然后是 cumsum(),因此 plot 可以总是从原点开始。 (2.) 如果 null 行彼此跟随到最后,则保留为 null else fillna(0):
data = {'year': [2010, 2011, 2012, 2013, 2014, 2015, 2016,2017, 2018, 2019],
'quantity': [10, 21, 20, 10, 39, 30, 31,45, 23, 56],
'sales': [None, 41, None, None, 32, 0, 31,None, None, None]}
df = pd.DataFrame(data)
df = df.set_index('year')
df['cum_sales'] = df[['sales']].cumsum()
print df
df.plot()
如何应用条件使结果变为:
请您参考如下方法:
我们将结合使用 bfill 和 combine_first。当我们回填 sales 列时,我们填充了任何缺失值,然后是非缺失数据,从而满足条件 (2)。但是,我仅使用它来识别那些确实满足条件 (2) 的位置,因为我随后会将这些位置乘以零并使用它来填充缺失值。我实际上并不想回填数据。 combine_first 首先从第一个数据帧中获取值,如果它丢失,它将尝试从第二个数据帧中获取它。因此,不满足条件 2 的缺失值将用零填充,否则将保持缺失状态。
很多话题:
df.sales = df.sales.combine_first(df.sales.bfill() * 0)
df.cum_sales = df.sales.cumsum()
print df
quantity sales cum_sales
year
2010 10 0.0 0.0
2011 21 41.0 41.0
2012 20 0.0 41.0
2013 10 0.0 41.0
2014 39 32.0 73.0
2015 30 0.0 73.0
2016 31 31.0 104.0
2017 45 NaN NaN
2018 23 NaN NaN
2019 56 NaN NaN
剧情:
df.plot()
