Создать новые столбцы на основе существующих столбцов и значений в Pandas - PullRequest
0 голосов
/ 26 апреля 2018

(1) С учетом следующего кадра данных:

    d   e     val
-----------------
1   0   40    125
2  10   35    150
3  11   30    110
4  15   65    115

Есть ли способ попасть в следующий ряд:

     val_0    val_10    val_11    val_15    e_0    e_10    e_11    e_15
-----------------------------------------------------------------------
1      125      150        110       115     40      35      30      65

Это довольно легко сделать с помощью ручной итерации по строкам, но в идеале я бы искал векторизованное решение. По сути, я думаю, что мне нужен способ создать / назначить строки на основе некоторого имени столбца + значения столбца.

(2) Следующим шагом было бы фактически вывести по одной строке для каждого значения, учитывая группу по столбцу. Чтобы построить на примере выше, следующее:

    d   e     val   gp
----------------------
1   0   40    125    3
2  10   35    150    3
3  11   30    110    3
4  15   65    115    3
1   0   70    225    4
2  10   85    250    4
3  11   90    210    4
4  15   95    215    4

Будет выводить:

gp   val_0   val_10   val_11   val_15   e_0    e_10    e_11    e_15
-------------------------------------------------------------------
 3     125      150      110      115    40      35      30      65
 4     225      250      210      215    70      85      90      95

Опять же, выполнение (2) при решении (1) может быть выполнено простым groupby('gp').apply(some_fun), но если бы в Pandas был встроенный способ сделать это, это было бы огромным преимуществом с точки зрения производительности.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете использовать изменение формы данных и выравнивание заголовков столбцов:

df_out = df.set_index('d').unstack().to_frame().T
df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format)

Выход:

   e_0  e_10  e_11  e_15  val_0  val_10  val_11  val_15
0   40    35    30    65    125     150     110     115

Редактировать для обработки нескольких строк

df_out = df.set_index(['gp','d']).unstack()
df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format)

Выход:

    e_0  e_10  e_11  e_15  val_0  val_10  val_11  val_15
gp                                                      
3    40    35    30    65    125     150     110     115
4    70    85    90    95    225     250     210     215

df_out = df_out.reset_index()

   gp  e_0  e_10  e_11  e_15  val_0  val_10  val_11  val_15
0   3   40    35    30    65    125     150     110     115
1   4   70    85    90    95    225     250     210     215
0 голосов
/ 26 апреля 2018

Это одно из решений оригинального вопроса.

val = pd.Series(df['val'].values, index='val_'+df['d'].apply(str))
e = pd.Series(df['e'].values, index='e_'+df['e'].apply(str))

res = pd.concat([val, e]).to_frame().T

print(res)

   val_0  val_10  val_11  val_15  e_40  e_35  e_30  e_65
0    125     150     110     115    40    35    30    65
...