我有一个数值型的DataFrame。最简单的追加一行数据(以给定索引值表示),这行数据代表着每一列的总和,应该怎么做呢?
要添加一个跨行总和的 Total
列:
df['Total'] = df.sum(axis=1)
添加一行,包含列总计:
df.loc['Total']= df.sum()
该方法可以同时给出行和列的总计:
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
.loc
之后才有效。不确定为什么。 - Sam R一种方法是创建一个包含列总和的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)
append
方法将与数据框具有相同索引的系列添加到数据框中。例如:df.append(pd.Series(df.sum(),name='Total'))
.pipe(lambda df: df.append(pd.Series(df.sum(), name='Total')))
- Levi Baguleydf = 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一样。
也许有人知道更简单的方法。
new_sum_col = list(df.sum(axis=1))
df['new_col_name'] = new_sum_col
对于那些因结果为0
或NaN
而遇到麻烦的人,请先检查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'])
我没有找到现代的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