简体   繁体   中英

Slice DataFrame at specific points and plot each slice

I am new to programming and Pythone could you help me? I have a data frame which look like this.

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)

I want to slice the data whenever value == 100 and then plot all slices in a figer. So my questions are how to slice or cut the data as described? and what's the best structure to save slices in order to plot?.

Note 1: value column has no frequency that I can use and it varies from 0 to 100 where time is arbitrary.

Note 2: I already tried this solution but I get the same table

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

Thanks in advance!

EDIT:

Here's a simpler way of handling my first answer (thanks to @aneroid for the suggestion).

Get the indices where value==100 and add +1 so that these land at the bottom of each slice:

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

Then use numpy.split (thanks to this answer for that method) to make a list of dataframes:

df_list = np.split(df, indices)

Then do your plotting for each slice in a for loop:

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

VERBOSE / FROM SCRATCH METHOD:

You can get the indices for where value==100 like this:

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

Then add the smallest and largest indices in order to not leave out the beginning and end of the df:

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

Then cycle through a while loop to cut up the dataframe and put each slice into a list of dataframes:

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

I already solved the problem using for loop , which can be used to slice and plot at the same time without using np.split function, as well as maintain the data structure. Thanks to the previous answer by @k_n_c, it helps me improve it.

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() 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM