向Pandas DataFrame添加列总计

93

我有一个数值型的DataFrame。最简单的追加一行数据(以给定索引值表示),这行数据代表着每一列的总和,应该怎么做呢?

9个回答

108

要添加一个跨行总和的 Total 列:

df['Total'] = df.sum(axis=1)

1
如果数据框中存在非数字列,则不会给出有意义的结果。 - Holger Brandl
10
这个回答增加了一列,而非原作者所要求的行。然而,这个回答对我解决问题很有帮助,所以我很感激。 - Mr. Lance E Sloan
3
这个答案解决了一个不同的问题。 - cs95

102

添加一行,包含列总计:

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

5
如果数据框中存在非数字列,则不会得到有意义的结果。 - Holger Brandl
2
如果出现NaN,首先应用df.fillna(0),然后使用此总和。 - David Gladson

51

**获取行列总计**

该方法可以同时给出行和列的总计:

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

这对我解决了问题。有没有可以观看的YouTube视频,可以解释一下这是如何工作的。对于像我这样的视觉学习者来说,仅仅阅读文档并不是最好的选择。 - JQTs
这对我有用,但只有在删除.loc之后才有效。不确定为什么。 - Sam R

8

一种方法是创建一个包含列总和的DataFrame,并使用DataFrame.append(...)。例如:

import numpy as np
import pandas as pd
# Create some sample data
df = pd.DataFrame({"A": np.random.randn(5), "B": np.random.randn(5)}) 
# Sum the columns:
sum_row = {col: df[col].sum() for col in df}
# Turn the sums into a DataFrame with one row with an index of 'Total':
sum_df = pd.DataFrame(sum_row, index=["Total"])
# Now append the row:
df = df.append(sum_df)

5
您可以使用append方法将与数据框具有相同索引的系列添加到数据框中。例如:
df.append(pd.Series(df.sum(),name='Total'))

@Alexander Huszagh,行和列的总计怎么办? - alancalvitti
如果你想在方法链的末尾添加,请这样做:.pipe(lambda df: df.append(pd.Series(df.sum(), name='Total'))) - Levi Baguley

5
我是这样做的:
df = pd.concat([df,pd.DataFrame(df.sum(axis=0),columns=['Grand Total']).T])

这将为每一行添加一个总列:
df = pd.concat([df,pd.DataFrame(df.sum(axis=1),columns=['Total'])],axis=1)

Series对象(或上面的dict)转换回DataFrame,然后再添加似乎有点烦人,但对于我的目的确实有效。

看起来这应该只是DataFrame的一个方法 - 就像pivot_table有margins一样。

也许有人知道更简单的方法。


1
  1. 计算总和并将结果转换为列表(axis=1:按行求和,axis=0:按列求和)
  2. 将步骤1的结果添加到现有的数据框中,并使用新名称
new_sum_col = list(df.sum(axis=1))
df['new_col_name'] = new_sum_col

0

对于那些因结果为0NaN而遇到麻烦的人,请先检查dtype

df.dtypes

由于sum函数只能处理数字类型,因此请先尝试更改数据框的类型。在这个例子中,将其更改为整数int32

df = df.astype('int32')
df.dtypes

然后,您应该能够跨行求和并添加新列(作为已接受的答案,而不是问题)。

df['sum']= df.sum(numeric_only=True,axis=1)

加分项:对求和列进行排序

df.sort_values(by=['sum'])

0

我没有找到现代的pandas方法!这个解决方案有点脏,因为有两个链接的转置,我不知道如何在行上使用.assign

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

# Solution
df.T.assign(Total = lambda x: x.sum(axis=1)).T

输出:

    a    b  c  Total
0  10  100  a    110
1  20  200  b    220


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接