Как сохранить заголовки столбцов при вставке строки суммы в фреймворк Pandas

У меня есть фреймворк:

       Name    y1    y2   y3                  
 1     Ben     01    02   03
 2     Jane    04    05   06
 3     Sarah   07    07   06

Я пытаюсь добавить строку в свой фрейм данных, которая предоставляет общее количество строк в каждом столбце. Мой код:

import pandas as pd

df = pd.DataFrame(np.insert(df.values, 0, values=[df.sum(axis=0)], axis=0))
df.set_value(0, 0,'total')
df.head()

Это успешно, но также удаляет имена моих столбцов следующим образом:

       0       1     2    3                     
 0     Total   12    14   15
 1     Ben     01    02   03
 2     Jane    04    05   06
 3     Sarah   07    07   06

вместо того, чтобы возвращать это по желанию:

       Name    y1    y2   y3                      
 0     Total   12    14   15
 1     Ben     01    02   03
 2     Jane    04    05   06
 3     Sarah   07    07   06

Я пробовал вставить

Index(['Name'], name=df.index.name)

к

df = pd.DataFrame(np.insert(df.values, 0, values=[df.sum(axis=0)], Index(['Name'], name=df.index.name) axis=0))

но это просто возвращает ошибку

TypeError: unhashable type: 'Index'

Где я ошибаюсь?

stackoverflow.com/questions/24284342/…
BENY 21.03.2018 14:27

Мечта о каждом ОП - много идеальных ответов :)

jezrael 21.03.2018 15:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
654
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать pandas.concat для объединения двух фреймов данных:

import pandas as pd
df = ...

df_total = pd.DataFrame(df.iloc[:, 1:].sum(), columns=["Total"]).T.reset_index()
df_total.columns = df.columns
df = pd.concat([df_total, df])
#     Name  y1  y2  y3
# 0  Total  12  14  15
# 1    Ben   1   2   3
# 2   Jane   4   5   6
# 3  Sarah   7   7   6

Один из способов избежать этого - добавить новую строку через .loc, а затем переместить ее наверх:

df.loc[len(df)+1] = ['Total'] + df.iloc[:, 1:].sum(axis=0).tolist()

df = df.loc[[df.index[-1]] + df.index[:-1].tolist(), :]

#     Name  y1  y2  y3
# 4  Total  12  14  15
# 1    Ben   1   2   3
# 2   Jane   4   5   6
# 3  Sarah   7   7   6

Вы можете использовать df.reset_index после этого, если это важно для вас.

IIUC, вы можете сделать это следующим образом, используя select_types, assign и pd.concat:

pd.concat([df.select_dtypes(include=np.number)
             .sum()
             .to_frame()
             .T
             .assign(Name='Total'),df])

Выход:

    Name  y1  y2  y3
0  Total  12  14  15
1    Ben   1   2   3
2   Jane   4   5   6
3  Sarah   7   7   6

Можешь попробовать

s=df.sum()    
s.loc['Name']='Total'
df.loc[0]=s    
df.sort_index()
Out[457]: 
    Name  y1  y2  y3
0  Total  12  14  15
1    Ben   1   2   3
2   Jane   4   5   6
3  Sarah   7   7   6
Ответ принят как подходящий

Решение с np.insert должно быть очень быстрым, но необходимо сначала создать index с нечисловыми столбцами:

#create index from `Name` column
df = df.set_index('Name')

#add first value to index
idx = np.insert(df.index, 0, 'Total')
#add columns and index parameters to DataFrame contructor and last reset index
df = pd.DataFrame(np.insert(df.values, 0, df.sum(), axis=0), 
                  columns=df.columns, 
                  index=idx).reset_index()
print (df)
    Name  y1  y2  y3
0  Total  12  14  15
1    Ben   1   2   3
2   Jane   4   5   6
3  Sarah   7   7   6

Это отлично сработало и на гораздо большем наборе данных. Я также заменил .mean на .sum, что может быть полезно другим, желающим сделать то же самое. idx = np.insert (df.index, 0, 'Среднее') df = pd.DataFrame (np.insert (df.values, 0, df.mean (), axis = 0),

Alex 21.03.2018 17:14

Другие вопросы по теме