Как мне решить эту «транспонирование» в Python?

1

Я пытаюсь сделать какое-то обратное преобразование, где идентификатор (ISIN) становится дублируемым, но где функция "Период" определяет период времени, а значения-функции идут от 3-х функций к одной и той же функции. Как я могу получить из dfs в dfs2 в Python?

dfs = pd.DataFrame({
    'ISIN': [
        'A', 'B', 'C'

    ],
    'Std3y': [
        0.10, 0.11, 0.15

    ],
      'Std5y': [
        0.14, 0.10, 0.18

    ],
    'Std8y': [
        0.17, 0.19, 0.11

    ],


})

dfs




dfs2 = pd.DataFrame({
    'ISIN': [
        'A', 'A', 'A',
        'B', 'B', 'B',
        'C', 'C', 'C'
    ],
    'Period': [
        '3y', '5y', '8y',
        '3y', '5y', '8y',
        '3y', '5y', '8y'


    ],
      'Std': [
        0.10, 0.14, 0.17,
        0.11, 0.10, 0.19,
        0.15, 0.18, 0.11
        ]


})

dfs2
Теги:
pandas
numpy
reverse
transpose

2 ответа

0
Лучший ответ

Используйте set_index с unstack и некоторыми очистками данных с помощью swaplevel, sort_index и reset_index:

df = dfs.set_index('ISIN') 
df.columns = df.columns.str[3:]
df = (df.unstack()
        .swaplevel(0,1)
        .sort_index()
        .rename_axis(['ISIN','Period'])
        .reset_index(name='Std'))
print (df)
  ISIN Period   Std
0    A     3y  0.10
1    A     5y  0.14
2    A     8y  0.17
3    B     3y  0.11
4    B     5y  0.10
5    B     8y  0.19
6    C     3y  0.15
7    C     5y  0.18
8    C     8y  0.11
  • 0
    Спасибо. Работает как шарм!
  • 0
    @Jonas - Добро пожаловать!
1

Вы можете использовать pd.melt для "раскроя" ваш фреймворк данных, а затем использовать нарезку строк:

res = pd.melt(dfs, id_vars='ISIN', value_vars=dfs.columns[1:].tolist())
res['variable'] = res['variable'].str[3:]

print(res)

  ISIN variable  value
0    A       3y   0.10
1    B       3y   0.11
2    C       3y   0.15
3    A       5y   0.14
4    B       5y   0.10
5    C       5y   0.18
6    A       8y   0.17
7    B       8y   0.19
8    C       8y   0.11

Ещё вопросы

Сообщество Overcoder
Наверх
Меню