Как преобразовать строки в столбец в Pandas Dataframe - PullRequest
1 голос
/ 17 октября 2019

У меня есть фрейм данных в следующем формате:

DF1: форма оригинального фрейма данных (1200, 9)

Это пример фрейма данных

    x1      x2      x3     Group

    1.0     0.0     0.0     A
    0.0     0.0     0.0     A
    0.0     3.0     11.0    A
    0.0     0.0     0.0     A
    0.0     1.0     0.0     A
    0.0     0.0     0.0     E
    0.0     0.0     0.0     E
    0.0     0.0     0.0     E
    0.0     0.0     6.0     E
    0.0     0.0     0.0     E

Iхочу вывод в следующем формате:

DF_Res:

Group    A    E
   x1  1.0  0.0
   x2  0.0  0.0
   x3  0.0  0.0

   x1  0.0  0.0
   x2  0.0  0.0
   x3  0.0  0.0

   x1  0.0  0.0
   x2  3.0  0.0
   x3  11.0  0.0

   x1  0.0  0.0
   x2  0.0  0.0
   x3  0.0  6.0

   x1  0.0  0.0
   x2  1.0  0.0
   x3  0.0  0.0

Я хочу преобразовать мои столбцы, чтобы они стали группой, а группа стала заголовком столбца.

Пожалуйста, помогите.

Спасибо

Ответы [ 2 ]

4 голосов
/ 17 октября 2019

Если нужны агрегированные значения, например, по sum для групп:

df1 = df.groupby('Group').sum().T.rename_axis(None, axis=1).rename_axis('Group').reset_index()
print (df1)
  Group    A    E
0    x1  0.0  0.0
1    x2  0.0  0.0
2    x3  0.0  0.0
3    x4  0.0  0.0
4    x5  0.0  0.0
5    x6  0.0  0.0
6    x7  0.0  0.0
7    x8  0.0  0.0

РЕДАКТИРОВАТЬ:

df2 = df.set_index('Group').T.rename_axis(None, axis=1).rename_axis('Group').reset_index()
print (df2)
  Group    A    A    E    E    A
0    x1  0.0  0.0  0.0  0.0  0.0
1    x2  0.0  0.0  0.0  0.0  0.0
2    x3  0.0  0.0  0.0  0.0  0.0
3    x4  0.0  0.0  0.0  0.0  0.0
4    x5  0.0  0.0  0.0  0.0  0.0
5    x6  0.0  0.0  0.0  0.0  0.0
6    x7  0.0  0.0  0.0  0.0  0.0
7    x8  0.0  0.0  0.0  0.0  0.0

РЕДАКТИРОВАТЬ1:

df = (df.set_index('Group')
        .groupby(level=0)
        .apply(lambda x: x.stack().reset_index(level=0, drop=True))
        .rename_axis(None)
        .rename_axis('Group', axis=1)
        .T
        .reset_index())

print (df)
   Group     A    E
0     x1   1.0  0.0
1     x2   0.0  0.0
2     x3   0.0  0.0
3     x1   0.0  0.0
4     x2   0.0  0.0
5     x3   0.0  0.0
6     x1   0.0  0.0
7     x2   3.0  0.0
8     x3  11.0  0.0
9     x1   0.0  0.0
10    x2   0.0  0.0
11    x3   0.0  6.0
12    x1   0.0  0.0
13    x2   1.0  0.0
14    x3   0.0  0.0
1 голос
/ 17 октября 2019

Это немного "хакерский", но вам нужно создать отдельный индекс для дифференциации ваших значений. Например, несколько значений соответствуют A и x1. Вот о чем я говорю:

df_new = df.set_index('Group')
df_new = df_new.groupby(df_new.index, as_index=False).apply(lambda x: x.stack().reset_index())
df_new.columns = ['Group', 'x', 'value']
df_new = df_new.droplevel(axis=0, level=0).set_index(['Group', 'x'], append=True).unstack('Group').droplevel(axis=1, level=0)

Результат:

Group     A    E
x               
x1      1.0  0.0
x2      0.0  0.0
x3      0.0  0.0
x1      0.0  0.0
x2      0.0  0.0
x3      0.0  0.0
x1      0.0  0.0
x2      3.0  0.0
x3     11.0  0.0
x1      0.0  0.0
x2      0.0  0.0
x3      0.0  6.0
x1      0.0  0.0
x2      1.0  0.0
x3      0.0  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...