绘制包含NaN的pandas数据帧

时间:2012-11-28 10:43:54

标签: pandas ipython data-analysis

我有来自三个不同GPS接收器的冰速GPS数据。这些数据位于大熊猫数据框中,其索引为朱利安日(从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

数据框格式为:

Index: 6071320 entries, 127.67291667 to 1338.51805556
Data columns:
R2    3487235  non-null values
R7    3875864  non-null values
R8    1092430  non-null values
dtypes: float64(3)

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

尝试df.plot()绘制整个数据帧(或其索引行位置)在绘制R7和R8方面工作正常,但不绘制R2。同样,仅仅执行df.R2.plot()也不起作用。绘制R2的唯一方法是执行df.R2.dropna().plot(),但这也会删除表示无数据周期的NaN(而不是仅比其他接收器更粗略的采样频率)。

还有其他人遇到过这个吗?我们将非常感激地提出有关该问题的任何想法:)

4 个答案:

答案 0 :(得分:11)

你没有看到任何东西的原因是因为默认的情节风格只是一条线。但该线路在NaN's中断,因此只会绘制多个连续值。后者在你的情况下不会发生。你需要改变绘图的风格,这取决于你想看到的内容。

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

.plot(marker='o')

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

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

答案 1 :(得分:5)

鉴于您要在有数据的点之间绘制一条直线,可以使Pandas通过插值来填充空白,然后绘制:

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

答案 2 :(得分:0)

我发现即使将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)

答案 3 :(得分:0)

这是另一种方式:

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)