Search code examples
pythonpandaspandas-groupbydata-sciencegoogle-colaboratory

How to slice a row with duplicate column names and stack that rows in order


enter image description here

I have a dataframe as shown in the image and I want to convert it into multiple rows without changing the order.

  RESP HR SPO2 PULSE
1  46  122  0    0   
2  46  122  0    0   
3
4

Solution

  • One possible solution is use reshape, only necessary modulo of length of columns is 0 (so is possible convert all data to 4 columns DataFrame):

    df1 = pd.Dataframe(df.values.reshape(-1, 4), columns=['RESP','HR','SPO2','PULSE'])
    df1['RESP1'] = df['RESP'].shift(-1)
    

    General data solution:

    a = '46 122 0 0 46 122 0 0 45 122 0 0 45 122 0'.split()
    df = pd.DataFrame([a]).astype(int)
    print (df)
        0    1  2  3   4    5  6  7   8    9  10  11  12   13  14
    0  46  122  0  0  46  122  0  0  45  122   0   0  45  122   0
    
    #flatten values
    a = df.values.ravel()
    #number of new columns
    N = 4
    #array filled by NaNs for possible add NaNs to end of last row
    arr = np.full(((len(a) - 1)//N + 1)*N, np.nan)
    #fill array by flatten values
    arr[:len(a)] = a
    #reshape to new DataFrame (last value is NaN)
    df1 = pd.DataFrame(arr.reshape((-1, N)), columns=['RESP','HR','SPO2','PULSE'])
    #new column with shifting first col
    df1['RESP1'] = df1['RESP'].shift(-1)
    print(df1)
       RESP     HR  SPO2  PULSE  RESP1
    0  46.0  122.0   0.0    0.0   46.0
    1  46.0  122.0   0.0    0.0   45.0
    2  45.0  122.0   0.0    0.0   45.0
    3  45.0  122.0   0.0    NaN    NaN