преобразуйте длинный фрейм данных в однострочный фрейм данных с перечислением имен столбцов

#pandas #dataframe

Вопрос:

у вас есть df, который выглядит так:

 data = 
[{'len_overlap': 2, 'prox': 1.0, 'freq_sum_w': 0.03962264150943396},
{'len_overlap': 22, 'prox': np.nan, 'freq_sum_w': 0.0311111962264150943396}]

df = pd.DataFrame(data)
 
len_overlap прокс freq_sum_w
0 2 1 0.0396226
1 22 nan 0.0311112

Я хочу сделать его кадром данных в одну строку, пока у меня есть это:

  pd.DataFrame([np.ravel(df.values)], columns=sum([[f'{x}_{n}' for x in df.columns] for n in range(df.shape[0])], []))
 
len_overlap_0 prox_0 freq_sum_w_0 лен_оверлап_1 прокс_1 freq_sum_в_1
0 2 1 0.0396226 22 nan 0.0311112

Это то, что я хочу (ints преобразуются в поплавки, не знаю почему, но это не проблема), но мне интересно, есть ли более приятный, более Панд способ сделать это.

Спасибо

Ответ №1:

Попробуйте через unstack() , to_frame() и Transpose(T) атрибут:

 out=df.unstack().to_frame().T
 

Окончательно:

 out.columns=out.columns.map(lambda x:'_'.join(map(str,x)))
 

выход из out :

     len_overlap_0   len_overlap_1   prox_0  prox_1  freq_sum_w_0    freq_sum_w_1
0   2.0             22.0            1.0     NaN     0.039623        0.031111
 

Ответ №2:

Одна строка, но более сложная:

 >>> df.unstack() 
      .to_frame() 
      .set_index(pd.MultiIndex.from_product([df.columns, df.index.astype(str)])
                              .sortlevel(1)[0]
                              .to_flat_index()
                              .map('_'.join)) 
      .transpose()

   freq_sum_w_0  len_overlap_0  prox_0  freq_sum_w_1  len_overlap_1    prox_1
0           2.0           22.0     1.0           NaN       0.039623  0.031111
 

ИМХО, я думаю, что «больше панд» — это использовать MultiIndex :

 >>> df.stack().to_frame().transpose()

            0                           1
  len_overlap prox freq_sum_w len_overlap freq_sum_w
0         2.0  1.0   0.039623        22.0   0.031111
 

или лучше (например pd.melt ):

 >>> df.stack()
0  len_overlap     2.000000
   prox            1.000000
   freq_sum_w      0.039623
1  len_overlap    22.000000
   freq_sum_w      0.031111
 

Ответ №3:

Попробуй,

 df_out = df.unstack()
df_out = df_out.sort_index(level=1)
df_out.index = [f'{i}_{j}' for i, j in df_out.index]
df_out.to_frame().T
 

Выход:

    freq_sum_w_0  len_overlap_0  prox_0  freq_sum_w_1  len_overlap_1  prox_1
0      0.039623            2.0     1.0      0.031111           22.0     NaN