从没有fillna或Interpolate的数据框中删除NaN值

时间:2016-12-20 22:49:13

标签: python pandas matplotlib plot

我有一个数据集:

           367235   419895  992194
1999-01-11  8   5   1
1999-03-23  NaN 4   NaN
1999-04-30  NaN NaN 1
1999-06-02  NaN 9   NaN
1999-08-08  2   NaN NaN
1999-08-12  NaN 3   NaN
1999-08-17  NaN NaN 10
1999-10-22  NaN 3   NaN
1999-12-04  NaN NaN 4
2000-03-04  2   NaN NaN
2000-09-29  9   NaN NaN
2000-09-30  9   NaN NaN

当我绘制它时,使用plt.plot(df, '-o')我得到了这个:

output from plotting dataframe

但我希望每列的数据点连接成一行,如下所示:

desired output from plotting dataframe

据我所知,matplotlib不会连接由NaN值分隔的数据点。我查看了处理缺失数据的所有选项here,但所有这些选项基本上都会错误地表示数据框中的数据。这是因为数据帧中的每个值都代表一个事件;如果我尝试用标量值替换NaN或使用插值选项,我会得到一堆实际上不在我的数据集中的点。这是插值的样子:

df_wanted2 = df.apply(pd.Series.interpolate)

enter image description here

如果我尝试使用dropna,我将丢失数据帧中的整行\列,这些行包含有价值的数据。

有谁知道连接点的方法?我怀疑我需要从数据框中提取单个数组并绘制它们,就像给出here的建议一样,但这看起来像很多工作(我的实际数据框要大得多。)有没有人有解决方案?

3 个答案:

答案 0 :(得分:11)

使用参数interpolate

'index'方法
df.interpolate('index').plot(marker='o')

enter image description here

替代答案

plot

之后

iteritems

for _, c in df.iteritems():
    c.dropna().plot(marker='o')

enter image description here

额外信用
仅从第一个有效索引插入到每列的最后一个有效索引

for _, c in df.iteritems():
    fi, li = c.first_valid_index(), c.last_valid_index()
    c.loc[fi:li].interpolate('index').plot(marker='o')

enter image description here

答案 1 :(得分:4)

尝试使用apply进行迭代,然后在apply函数中删除缺少的值

def make_plot(s):
    s.dropna().plot()

df.apply(make_plot)

答案 2 :(得分:3)

另一种方法是使用connectgaps函数将NaN处理外包给图表库Plotly。

import plotly
import pandas as pd

txt = """367235 419895 992194
1999-01-11 8 5 1
1999-03-23 NaN 4 NaN
1999-04-30 NaN NaN 1
1999-06-02 NaN 9 NaN
1999-08-08 2 NaN NaN
1999-08-12 NaN 3 NaN
1999-08-17 NaN NaN 10
1999-10-22 NaN 3 NaN
1999-12-04 NaN NaN 4
2000-03-04 2 NaN NaN
2000-09-29 9 NaN NaN
2000-09-30 9 NaN NaN"""

data_points = [line.split(' ') for line in txt.splitlines()[1:]]
df = pd.DataFrame(data_points)

data = list()
for i in range(1, len(df.columns)):
    data.append(plotly.graph_objs.Scatter(
        x = df.iloc[:,0].tolist(),
        y = df.iloc[:,i].tolist(),
        mode = 'line',
        connectgaps = True
    ))

fig = dict(data=data)
plotly.plotly.sign_in('user', 'token')
plot_url = plotly.plotly.plot(fig)

enter image description here