Добавить строку итогов в панде dataframe без суммы имен? - PullRequest
1 голос
/ 07 мая 2019

У меня есть этот фрейм данных:

Data = {'name':  ['a', 'b'],
        'number1': [5, 3],
        'number2': [3, 2]
        }
df = pd.DataFrame(Data, columns = ['name','number1', 'number2'])

Я хочу добавить еще одну строку, которая будет содержать суммы столбцов number1 и number2. Итак, мой желаемый результат таков:

Data2 = {'name':  ['a', 'b', 'total'],
        'number1': [5, 3, 8],
        'number2': [3, 2, 5]
        }
df2 = pd.DataFrame(Data2, columns = ['name','number1', 'number2'])

Я попробовал решение, предлагаемое в этой теме: Общая строка данных Pandas

Но эта строка

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

также составляет сумму имен, поэтому в итоге я получаю Total в качестве индекса и в столбце имен я получаю значение ab (потому что a + b). Есть ли способ получить df, который выглядит точно так же, как мой желаемый результат df?

Ответы [ 4 ]

3 голосов
/ 07 мая 2019

Вот один из способов:

df.append(df.sum().rename('total').replace({'ab':'total'})).reset_index(drop=True)

     name  number1  number2
0      a        5        3
1      b        3        2
2  total        8        5
3 голосов
/ 07 мая 2019

Используйте Series.append по столбцам, отфильтрованным по позициям по DataFrame.iloc или только по числовым столбцам по DataFrame.select_dtypes:

df.loc[len(df)] = df.iloc[:, 1:].sum().append(pd.Series({'name':'total'}))
print (df)
    name  number1  number2
0      a        5        3
1      b        3        2
2  total        8        5

Или:

df.loc[len(df)] = df.select_dtypes(np.number).sum().append(pd.Series({'name':'total'}))
3 голосов
/ 07 мая 2019

Я использую .loc

df.loc[df.index.max()+1]=['total']+df.sum().tolist()[1:]
df
Out[80]: 
    name  number1  number2
0      a        5        3
1      b        3        2
2  total        8        5
3 голосов
/ 07 мая 2019

Использование:

m=df.set_index('name')
m.loc['total']=m.sum()
print(m)

       number1  number2
name                   
a            5        3
b            3        2
total        8        5

Вы также можете reset_index(), если вы хотите иметь столбец name в качестве столбца:

print(m.reset_index())

    name  number1  number2
0      a        5        3
1      b        3        2
2  total        8        5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...