Преобразование фрейма данных с использованием транспонирования и выравнивания

#python-3.x #pandas #dataframe

Вопрос:

У меня есть фрейм данных, который выглядит так:

 tdelta      A       B     label

 1          11      21      Lab1
 2          24      45      Lab2
 3          44      65      Lab3
 4          77      22      Lab4
 5          12      64      Lab5
 6          39      09      Lab6
 7          85      11      Lab7
 8          01      45      Lab8
 

И мне нужно преобразовать этот набор данных в:

 For selected window: 4

A1  A2  A3  A4  B1  B2  B3  B4  L1       label
11  24  44  77  21  45  65  22  Lab1      Lab4
12  39  85  01  64  09  11  45  Lab5      Lab8
 

Поэтому, основываясь на выбранном окне — «w», мне нужно перенести строки w с первой соответствующей меткой в качестве моих значений X и соответствующей последней меткой в качестве моего значения Y. вот что я разработал до сих пор:

 def data_process(data,window):
    n=len(data)
    A = pd.DataFrame(data['A'])
    B = pd.DataFrame(data['B'])
    
    lb = pd.DataFrame(data['lab'])
    df_A = pd.concat([gsr.loc[i] for i in range(0,window)],axis=1).reset_index()
    df_B = pd.concat([st.loc[i] for i in range(0,window)],axis=1).reset_index()
   
    df_lb = pd.concat([lb.loc[0],axis=1).reset_index() 
    X = pd.concat([df_A,df_B,df_lab],axis=1)
    
    Y = pd.DataFrame(data['lab']).shift(-window)
    
    return X, Y
 

Я думаю, что это работает только для первых строк «окна». Мне нужно, чтобы он работал для всего моего фрейма данных.

Комментарии:

1. Что произойдет, если w будет 3? Ожидаете ли вы, что в вашем выводе будет 3 строки [строки 0,1,2; строки 3,4,5; строки 6,7]?

2. @ALollz это правильно

Ответ №1:

Это , по сути, а pivot , с большой очисткой после поворота. Чтобы сводная таблица работала, нам нужно использовать целочисленное и модульное деление, чтобы мы могли сгруппировать строки в окна длины w и определить, к какому столбцу они затем принадлежат.

 # Number of rows to group together
w = 4

df['col'] = np.arange(len(df))%w   1
df['i'] = np.arange(len(df))//w

# Reshape and flatten the MultiIndex
df = (df.drop(columns='tdelta')
        .pivot(index='i', columns='col')
        .rename_axis(index=None))
df.columns = [f'{x}{y}'for x,y in df.columns]

# Define these columns and remove the intermediate label columns.
df['L1'] = df['label1']
df['label'] = df[f'label{w}']
df = df.drop(columns=[f'label{i}' for i in range(1, w 1)])
 

 print(df)

   A1  A2  A3  A4  B1  B2  B3  B4    L1 label
0  11  24  44  77  21  45  65  22  Lab1  Lab4
1  12  39  85   1  64   9  11  45  Lab5  Lab8
 

Комментарии:

1. не меняйте все столбцы перед комментарием #define. Это выдаст ключевую ошибку для метки 1

2. Я просто сглаживаю мультииндекс кортежей в индекс одного уровня.

3. что такое df[‘Label1’] в последней третьей строке ? вы не инициализировали его раньше

4. @KathanVyas строка перед этим создает метку столбца, когда она сворачивает мультииндекс.

5. Но это здесь дает мне ошибку » KeyError: «label1».