#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».