Pandas从不同的列绘制线,忽略值

2024-10-03 23:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如果在pandas数据帧中,我有两个列,如下所示:

df.high
Out[11]: 
date
2004-01-14       NaN
2004-01-15    1.2675
2004-01-16    1.2609
2004-01-19    1.2426
2004-01-20       NaN
2004-01-21       NaN
2004-01-22       NaN
2004-01-23    1.2778
2004-01-26    1.2616  

df.low
Out[12]: 
date
2004-01-14       NaN
2004-01-15    1.2558
2004-01-16    1.2349
2004-01-19    1.2334
2004-01-20       NaN
2004-01-21       NaN
2004-01-22       NaN
2004-01-23    1.2564
2004-01-26    1.2457 

如何使用测向高最后一批人测向低忽略beetween中的值?

例如,在本例中,第一行必须来自测向高2004-01-15至测向低2004年1月19日,第二次测向高01-23至测向低01-26日

仅供参考,除了这个例子之外,我还有比这个更大的数据帧,其中值组与nan组交替,我需要保持datetime索引的顺序不变。在


Tags: 数据pandasdfdatetimedate顺序nanout
1条回答
网友
1楼 · 发布于 2024-10-03 23:17:51

首先,可以构建一个根据NaN拆分数据帧的函数:

def mysplit(df):
    parts = np.split(df, np.where(np.isnan(df.value))[0])
    # removing NaN entries
    parts = [part[~np.isnan(part.value)] for part in parts
              if not isinstance(part, np.ndarray)]
    # removing empty DataFrames
    parts = [part for part in parts if not part.empty]
    return parts

然后,您可以对您拥有的每个数据帧运行此函数:

^{pr2}$

便于绘制:

import matplotlib.pyplot as plt
values = [[i.values[0,1], i.values[-1,1]] for i,j in zip(parts1, parts2)]
for value in values:
    plt.plot([0,1], value)

enter image description here


编辑:要实现您在评论中的建议,您可以稍微更改最后一部分:

for i,j in zip(parts1, parts2):
    plt.plot([i.index[0], j.index[-1]], [i.values[0,1], j.values[-1,1]])
plt.show()

给予:

enter image description here

相关问题 更多 >