Рассмотрим следующий фрейм данных с многоуровневым индексом:

arrays = [np.array(['bar', 'bar', 'baz']),
          np.array(['one', 'two', 'one'])]

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 
                   columns=['a', 'b', 'c'],
                   index=arrays)

Все, что я пытаюсь сделать, это добавить строку «Итоги» внизу (здесь будут ожидаемые значения 12, 15, 18). Кажется, мне нужно вычислить итоги, а затем добавить их в кадр данных, но я просто не могу заставить его работать, сохраняя многоуровневый индекс (что я хочу сделать). Заранее спасибо!

0
Paul 16 Апр 2020 в 01:23

2 ответа

Лучший ответ

Я понял. Спасибо за ответы. Эти плюсы и немного больше знаний об индексах в Python помогли мне кое-что сделать.

# Create df of totals
df2 = pd.DataFrame(df.sum())
# Transpose df
df2 = df2.T
# Reset index
df2 = df2.reset_index()
# Add additional column so the columns of df2 match the columns of df
df2['Index'] = "zTotal"
# Set indices to match df indices
df2 = df2.set_index(['index', 'Index'])
# Concat df and df2
df3 = pd.concat([df, df2])
# Sort in desired order
df3 = df3.sort_index(ascending=[False,True])
0
Paul 21 Апр 2020 в 19:37

Это не сохраняет ваш многоуровневый индекс, но добавляет новую строку с именем «total», которая содержит суммы столбцов:

import pandas as pd
import numpy as np

arrays = [np.array(['bar', 'bar', 'baz']),
          np.array(['one', 'two', 'one'])]

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 
                   columns=['a', 'b', 'c'],
                   index=arrays)

df.append(df.sum().rename('total')).assign(total=lambda d: d.sum(1))
0
dkritz 15 Апр 2020 в 23:16