如果在 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
如何使用 df.high 中组的第一个值和 df.low 中组的最后一个值绘制每组值的直线,而忽略 between 中的值?
例如在此示例中,第一行必须从 df.high 2004-01-15 到 df.low 2004-01-19,第二行必须从 df.high 01-23 到 df.low 01-26
仅供引用,除了这个例子之外,我还有比这个更大的数据帧,其中值组与 NaN 组交替,并且我需要将日期时间索引保持在相同的顺序。
最佳答案
首先,您可以构建一个根据 NaN
分割 DataFrame 的函数:
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
然后您可以为您拥有的每个 DataFrame 运行此函数:
parts1 = mysplit(df1)
#[ date value
#1 2004-01-15 00:00:00 1.2675
#2 2004-01-16 00:00:00 1.2609
#3 2004-01-19 00:00:00 1.2426,
# date value
#7 2004-01-23 00:00:00 1.2778
#8 2004-01-26 00:00:00 1.2616]
parts2 = mysplit(df2)
#[ date value
#1 2004-01-15 00:00:00 1.2558
#2 2004-01-16 00:00:00 1.2349
#3 2004-01-19 00:00:00 1.2334,
# date value
#7 2004-01-23 00:00:00 1.2564
#8 2004-01-26 00:00:00 1.2457]
使绘图变得容易:
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)
编辑:要实现您在评论中建议的内容,您可以稍微更改最后一部分:
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()
给予:
关于python - Pandas 从不同的列绘制线条忽略值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21389009/