【问题标题】:Slice DataFrame at specific points and plot each slice在特定点切片 DataFrame 并绘制每个切片
【发布时间】:2021-06-28 11:29:45
【问题描述】:

我是编程新手,Pythone 你能帮我吗? 我有一个看起来像这样的数据框。

d = {'time': [4, 10, 15, 6, 0, 20, 40, 11, 9, 12, 11, 25], 
     'value': [0, 0, 0, 50, 100, 0, 0, 70, 100, 0,100, 20]}    
df = pd.DataFrame(data=d)

我想在value == 100 时对数据进行切片,然后在一个figer 中绘制所有切片。 所以我的问题是如何按照描述对数据进行切片或切割?为了绘图而保存切片的最佳结构是什么?

注意 1:值列没有我可以使用的频率,它从 0 到 100 不等,其中时间是任意的。

注意 2:我已经尝试过这个解决方案,但我得到的是同一张桌子

decreased_value = df[df['value'] <= 100][['time', 'value']].reset_index(drop=True)

How can I slice one column in a dataframe to several series based on a condition

提前致谢!

【问题讨论】:

  • 试试slices = df.loc[df['value'] == 100, :]
  • 谢谢!在这种情况下,我只得到 value ==100 的行,但我想在每个切片中获取整个数据,直到 value ==100
  • 所以你想把上面的例子分成四个切片,每个切片的最后一行是100?

标签: python pandas dataframe plot slice


【解决方案1】:

编辑:

这是处理我的第一个答案的一种更简单的方法(感谢@aneroid 的建议)。

获取value==100 所在的索引并添加+1 以便它们位于每个切片的底部:

indices = df.index[df['value'] == 100] + 1

然后使用numpy.split(感谢this对该方法的回答)制作数据框列表:

df_list = np.split(df, indices)

然后在 for 循环中为每个切片进行绘图:

for df in df_list:
     --- plot based on df here ---

详细/从头开始方法:

您可以像这样获取value==100 的索引:

indices = df.index[df.value==100]

然后添加最小和最大的索引,以免漏掉 df 的开头和结尾:

indices = indices.insert(0,0).to_list()
indices.append(df.index[-1]+1)

然后循环通过一个while循环来切割数据帧并将每个切片放入数据帧列表中:

i = 0
df_list = []
while i+1 < len(indices):
    df_list.append(df.iloc[indices[i]:indices[i+1]])
    i += 1

【讨论】:

  • 从您的链接问题来到这里。这可以减少到indices = df.index[df['value'] == 100],然后是df_list = np.split(df, indices) - 因为第一个要拆分的索引之前的第一部分无论如何都是第一部分。无需显式添加第一个和最后一个索引,因为这会将空数据框作为第一个元素。
  • 好点。我检查了这个,但我一定做错了,因为 numpy 似乎没有保留开头和结尾。但是,您必须在此处为用例的每个索引添加 +1
  • 确实,如果 OP 希望每个切片以 value 100 结尾(我从他们的问题中不清楚),那么将 1 添加到索引中。但是,对于重复从 0 到 100 的事情,以 100 结尾的用例是有意义的。
  • 提出一个关于 SO 的问题以改进您自己对另一个问题的回答的好主意 :)
  • @Ben.T 我相信这只是很多次中的第一次哈哈 :)
【解决方案2】:

我已经用for loop解决了这个问题,不用np.split函数就可以同时进行切片和绘图,以及维护数据结构。 感谢@k_n_c 之前的回答,它帮助我改进了它。

slices = df.index[df['score'] == 100]
slices = slices + 1

slices = np.insert(slices, 0,0, axis=0)
slices = np.append(slices,df.index[-1]+1)

prev_ind = 0
for ind in slices:
    temp = df.iloc[prev_ind:ind,:] 
    plt.plot(temp.time, temp.score)
    prev_ind = ind
plt.show() 

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2018-05-07
    相关资源
    最近更新 更多