【问题标题】:Plot pandas dataframe containing NaNs绘制包含 NaN 的 pandas 数据框
【发布时间】:2012-11-16 04:37:11
【问题描述】:

我有来自三个不同 GPS 接收器的冰速 GPS 数据。数据位于 pandas 数据框中,索引为 julian day(从 2009 年初开始递增)。

这是数据的一个子集(主数据集是 3487235 行...):

                    R2          R7         R8
1235.000000 116.321959  100.805197  96.519977
1235.000116 NaN         100.771133  96.234957
1235.000231 NaN         100.584559  97.249262
1235.000347 118.823610  100.169055  96.777833
1235.000463 NaN         99.753551   96.598350
1235.000579 NaN         99.338048   95.283989
1235.000694 113.995003  98.922544   95.154067

数据框的格式为:

索引:6071320 个条目,127.67291667 到 1338.51805556 数据列: R2 3487235 非空值 R7 3875864 非空值 R8 1092430 非空值 数据类型:float64(3)

R2 以与 R7 和 R8 不同的速率采样,因此 NaN 系统地出现在该间距处。

尝试df.plot() 绘制整个数据框(或其索引行位置)在绘制 R7 和 R8 方面效果很好,但不绘制 R2。同样,只做df.R2.plot() 也行不通。绘制 R2 的唯一方法是执行 df.R2.dropna().plot(),但这也会删除表示无数据周期的 NaN(而不是比其他接收器更粗略的采样频率)。

还有其他人遇到过这个吗?任何关于这个问题的想法都将不胜感激:)

【问题讨论】:

  • 您应该将您的时间步长转换为 DatetiemIndex,然后重新采样 R2

标签: pandas ipython data-analysis


【解决方案1】:

您看不到任何东西的原因是因为默认的绘图样式只有一条线。但是这条线在 NaN 处被打断,因此只会绘制多个连续的值。后者不会发生在你的情况下。你需要改变绘图的风格,这取决于你想看到什么。

对于初学者,请尝试添加:

.plot(marker='o')

这应该使所有数据点显示为圆圈。它很容易变得混乱,因此调整标记大小、边缘颜色等可能很有用。我没有完全适应 Pandas 如何使用 matplotlib,所以如果情节变得更复杂,我经常自己切换到 matplotlib,例如:

plt.plot(df.R2.index.to_pydatetime(), df.R2, 'o-')

【讨论】:

  • 感谢 Rutger,目前这是一个很好的解决方法。我使用 pandas 的一个重要原因是在诸如互相关之类的事物计算之前将所有内容重新索引到相同的采样间隔,因此我可能会继续使用独立的 matplotlib 进行基本绘图。谢谢。
【解决方案2】:

鉴于你想在你有数据的点之间画一条直线,你可以让 Pandas 通过插值来填补空白,然后绘制:

.interpolate(method='linear').plot()

【讨论】:

    【解决方案3】:

    我发现即使 df 被索引为 DateTime 也会发生相同的问题。确保尊重所有数据点且行之间没有间隙的一种解决方案是分别绘制每个 df 列并删除 NaN。

        for col in df.columns:
            plot_data = df[col].dropna()
            ax.plot(plot_data.index.values, plot_data.values, label=col)
    

    【讨论】:

      【解决方案4】:

      这是另一种方式:

      nan_columns = []
      nan_values = []
      
      for column in dataset.columns:
          nan_columns.append(column)
          nan_values.append(dataset[column].isnull().sum())
      
      fig, ax = plt.subplots(figsize=(30,10))
      plt.bar(nan_columns, nan_values)
      

      【讨论】:

        猜你喜欢
        • 2018-11-02
        • 2018-03-28
        • 2016-01-23
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多