Pandas/matplotlib没有绘制所有列数据

3

我有一个名为“blah”的数据框,是这样创建的:

blah = pandas.read_csv(address, index_col='Date', parse_dates=True)
blah.head()
                 TransactionName  Withdrawal  Deposit    Total
Date                                                          
2016-12-01  PTS TO:  #######           10.00      NaN  2612.27
2016-12-01  ###############           250.00      NaN  2362.27
2016-12-01  SSV TO:  ###########        1.00      NaN  2361.27
2016-12-01  ###############            62.86      NaN  2298.41
2016-12-02  SSV TO:  ###########        2.00      NaN  2296.41

我想绘制日期与存款之间的关系。大约有790行存款数据,只有57行包含数值,其他全部为“NaN”。

blah['Deposit'].plot()

那个命令输出这个图: 糟糕的图表

问题在于这张图上没有展示所有的存款。如果我创建一个Series,然后删除所有NaN值并绘制它,一切都很好:

derp = blah['Deposit'].dropna()
derp.plot()

在这里,您可以查看所有存款活动。请注意2017年12月后的存款,这些存款不会显示在原始数据中。 好图表

为什么第一个案例中并没有绘制出所有的值?如果我创建了“blah”但没有将日期设置为索引列,则问题仍然存在。只是将图形绘制在行的索引#上,而不是针对“日期”绘制图形。

我的目标是在同一张图中针对日期绘制总计、提取和存款三列。其他两列用命令输出正常:

blah['Total'].plot() 
blah['Withdrawal'].plot()
1个回答

4

NaN会打断折线图:

因为数据中仍存在NaN,折线将被打断。Pandas不知道如何通过NaN连续折线,因此只能绘制连续的数字值。您必须删除NaN才能使该线条在整个有效数据范围内继续延伸。如果绘制点,则可以看到所有内容。

这里是一个链接,其中提到了关于绘制包含NaN的线的问题。

可重现的例子:

import random
import pandas as pd
import numpy as np

c = [np.nan] * 10
c.extend(random.sample(range(100), 10))
random.shuffle(c)

d = {"a":random.sample(range(100), 20), "b":random.sample(range(100), 20), "c":c}

df = pd.DataFrame(d)

df.plot(style="-o") # both points and line to show all values

df.dropna().plot()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接