【问题标题】:Remove NaN values from dataframe without fillna or Interpolate从没有填充或插值的数据框中删除 NaN 值
【发布时间】:2017-05-06 06:24:22
【问题描述】:

我有一个数据集:

           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') 我得到这个:

但我想要的是每列的数据点连接成一条线,如下所示:

我了解 matplotlib 不会连接由 NaN 值分隔的数据点。我查看了所有用于处理丢失数据的选项here,但它们基本上都会歪曲数据框中的数据。这是因为数据框中的每个值都代表一个事件;如果我尝试用标量值替换 NaN 或使用 interpolate 选项,我会得到一堆实际上不在我的数据集中的点。下面是 interpolate 的样子:

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

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

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

【问题讨论】:

    标签: python pandas matplotlib plot


    【解决方案1】:

    使用interpolate方法和参数'index'

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

    替代答案

    plotiteritems 之后

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


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

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

    【讨论】:

    • 第二个答案效果很好,因为线条没有走到情节的结尾 - 非常感谢!
    • IMO,如果您首先移动“替代答案”(甚至将其设为唯一),则此答案将得到改善。其他两种方法会产生误导性的图,因为它们添加了实际不存在于 OP 数据中的明显数据点。
    • @IlmariKaronen 好点。稍后我将进行编辑并使其更加清晰。感谢反馈
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。选择@pirsquared 答案,因为它更好更完整
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 2019-05-10
      • 2021-01-20
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多