python - Pandas/matplotlib 没有绘制所有列数据
问题描述
我有一个名为“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()
该命令输出此图: Crappy plot
问题是这个地块上没有所有的存款。如果我创建一个系列,然后删除所有的 NaN 并绘制它,一切都很好:
derp = blah['Deposit'].dropna()
derp.plot()
在这里你可以看到所有的存款活动。请注意 2017-12 之后未出现在原始版本中的存款。好情节
为什么不是所有值都在第一种情况下绘制?如果我在没有将 Date 设置为索引列的情况下创建“blah”。问题仍然存在。除了不是根据“日期”绘制之外,该图是根据行的索引 # 绘制的。
我的目标是在同一图表上针对日期绘制总计、取款和存款列。使用以下命令,其他两列都可以正常输出:
blah['Total'].plot()
blah['Withdrawal'].plot()
解决方案
NaN 将始终中断线图:
因为 NaN 仍然存在于数据中,所以行会被中断。Pandas 不知道如何通过 NaN 携带线,因此只能绘制连续的数值。您必须删除 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()
推荐阅读
- c++ - 将二维数组转换为犰狳矩阵(垫)对象
- php - laravel 之间不能使用变量
- reactjs - Tailwind CSS背景渐变不适用
- algorithm - 为生产者服务的队列
- c# - Visual Studio 中的 Microsoft Text To Speech Infinite Await
- javascript - 如何在 Python Selenium 中获取 Javascript ajax 响应?
- html - 延迟悬停效果 - 防止关闭覆盖
- r - 在我的 CSV 文件中,当我实际上有 15 列时,它显示我有 1 列
- c++ - HTTP标头和数据响应,如何解码数据中的%?
- oauth-2.0 - 什么是无浏览器连接的正确授权类型,例如从服务器调用 REST API?