Общая строка данных панд

У меня есть dataframe, что-то вроде:

     foo  bar  qux
0    a    1    3.14
1    b    3    2.72
2    c    2    1.62
3    d    9    1.41
4    e    3    0.58

и я хотел бы добавить строку "total" в конец фрейма данных:

     foo  bar  qux
0    a    1    3.14
1    b    3    2.72
2    c    2    1.62
3    d    9    1.41
4    e    3    0.58
5    tot  15   9.47

Я попытался использовать команду sum но в итоге у меня есть серия, которая, хотя я могу преобразовать обратно в Dataframe, не поддерживает типы данных:

tot_row = pd.DataFrame(df.sum()).T
tot_row['foo'] = 'tot'
tot_row.dtypes:
     foo    object
     bar    object
     qux    object

Я хотел бы сохранить типы данных из исходного фрейма данных, так как мне нужно применить другие операции к общей строке, например:

baz = 2*tot_row['qux'] + 3*tot_row['bar']

Ответ 1

Добавить итоговую строку с

df.append(df.sum(numeric_only=True), ignore_index=True)

Преобразование необходимо, только если у вас есть столбец строк или объектов.

Это немного хрупкое решение, поэтому я бы рекомендовал придерживаться операций с DataFrame. например.

baz = 2*df['qux'].sum() + 3*df['bar'].sum()

Ответ 2

Используйте DataFrame.pivot_table с margins=True:

import pandas as pd
data = [('a',1,3.14),('b',3,2.72),('c',2,1.62),('d',9,1.41),('e',3,.58)]
df = pd.DataFrame(data, columns=('foo', 'bar', 'qux'))

Оригинал df:

  foo  bar   qux
0   a    1  3.14
1   b    3  2.72
2   c    2  1.62
3   d    9  1.41
4   e    3  0.58

Поскольку pivot_table требует какой-то группировки (без аргумента index, она вызовет ValueError: No group keys passed!), А ваш исходный индекс будет пустым, мы будем использовать столбец foo:

df.pivot_table(index='foo',
               margins=True,
               margins_name='total',  # defaults to 'All'
               aggfunc=sum)

Вуаля!

       bar   qux
foo             
a        1  3.14
b        3  2.72
c        2  1.62
d        9  1.41
e        3  0.58
total   18  9.47

Ответ 3

Альтернативный способ (проверен на Pandas 0.18.1):

import numpy as np
total = df.apply(np.sum)
total['foo'] = 'tot'
df.append(pd.DataFrame(total.values, index=total.keys()).T, ignore_index=True)

Результат:

   foo   bar   qux
0    a     1  3.14
1    b     3  2.72
2    c     2  1.62
3    d     9  1.41
4    e     3  0.58
5  tot    18  9.47

Ответ 4

df.loc["Total"] = df.sum()

работает для меня, и мне легче запомнить. Я что-то пропустил? Вероятно, было невозможно в более ранних версиях.

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

Только что нашел

df.append(df.sum().rename('Total'))

Это печатает то, что я хочу, в записной книжке Jupyter и, кажется, оставляет нетронутым сам df.

Ответ 5

После этого мне помогли добавить общее количество столбцов и итоговую строку в кадр данных.

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

from io import StringIO
import pandas as pd

#create dataframe string
dfstr = StringIO(u"""
a;b;c
1;1;1
2;2;2
3;3;3
4;4;4
5;5;5
""")

#create dataframe dft1 from string
dft1 = pd.read_csv(dfstr, sep=";")

## add a column total to dft1
dft1['Total'] = dft1.sum(axis=1)

## add a row total to dft1 with the following steps

sum_row = dft1.sum(axis=0) #get sum_row first
dft1_sum=pd.DataFrame(data=sum_row).T #change it to a dataframe

dft1_sum=dft1_sum.reindex(columns=dft1.columns) #line up the col index to dft1
dft1_sum.index = ['row_total'] #change row index to row_total

dft1.append(dft1_sum) # append the row to dft1

Ответ 6

Это то, как я это делаю, транспонируя и используя метод assign в сочетании с лямбда-функцией. Это делает это простым для меня.

df.T.assign(GrandTotal = lambda x: x.sum(axis=1)).T

Ответ 7

Опираясь на ответ JMZ

df.append(df.sum(numeric_only=True), ignore_index=True)

если вы хотите продолжить использовать текущий индекс, вы можете назвать серию сумм с помощью .rename() следующим образом:

df.append(df.sum().rename('Total'))

Это добавит строку внизу таблицы.

Ответ 8

Опираясь на ответ от Матиаса Кауэра.

Чтобы добавить общее количество строк:

df.loc["Row_Total"] = df.sum()

Чтобы добавить общее количество столбцов,

df.loc[:,"Column_Total"] = df.sum(axis=1)

Ответ 9

Это дает общее количество строк и столбцов.

import numpy as np
import pandas as pd


df = pd.DataFrame({'a': [10,20],'b':[100,200],'c': ['a','b']})

df.loc['Column_Total']= df.sum(numeric_only=True, axis=0)
df.loc[:,'Row_Total'] = df.sum(numeric_only=True, axis=1)

print(df)


                 a      b    c  Row_Total
0             10.0  100.0    a      110.0
1             20.0  200.0    b      220.0
Column_Total  30.0  300.0  NaN      330.0