Python 数据帧总行数

Python 数据帧总行数,python,pandas,Python,Pandas,我有一个数据帧,类似于: 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 baz = 2*tot_row['qux'] + 3*tot_row['bar'] 我想在数据帧的末尾添加一个“总计”行: foo bar qux 0 a 1 3.14 1 b 3

我有一个数据帧,类似于:

     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
baz = 2*tot_row['qux'] + 3*tot_row['bar']
我想在数据帧的末尾添加一个“总计”行:

     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
命令,但最终得到了一个系列,虽然我可以将其转换回数据帧,但无法维护数据类型:

tot_row = pd.DataFrame(df.sum()).T
tot_row['foo'] = 'tot'
tot_row.dtypes:
     foo    object
     bar    object
     qux    object
我希望维护原始数据框中的数据类型,因为我需要对总行应用其他操作,例如:

     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
baz = 2*tot_row['qux'] + 3*tot_row['bar']

将总计行追加为

df.append(df.sum(numeric_only=True), ignore_index=True)
仅当您有一列字符串或对象时,才需要进行转换

这是一个有点脆弱的解决方案,所以我建议坚持数据帧上的操作。例如

baz = 2*df['qux'].sum() + 3*df['bar'].sum()
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\u表
需要某种类型的分组(没有
index
参数,它将引发
ValueError:没有传递组键!
),并且您的原始索引是空的,因此我们将使用
foo
列:

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

替代方式(在0.18.1中验证):

结果:

   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

下面的内容帮助我将列合计和行合计添加到数据框中

假设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
这对我很有用,我发现它更容易记住。我错过什么了吗? 可能在早期版本中不可能

实际上,我只想暂时添加总行。 永久性地添加它有利于显示,但会使进一步的计算变得麻烦

刚找到

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

这将在Jupyter笔记本中打印我想要的内容,并且似乎使df本身保持不变。

这就是我的方法,通过转置和使用assign方法以及lambda函数。这对我来说很简单

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

基于JMZ答案的构建

df.append(df.sum(numeric_only=True), ignore_index=True)
如果要继续使用当前索引,可以使用.rename()为求和序列命名,如下所示:

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

这将在表格底部添加一行。

基于Matthias Kauer的答案

要添加行总数,请执行以下操作:

df.loc["Row_Total"] = df.sum()
要添加列总数

df.loc[:,"Column_Total"] = df.sum(axis=1)
新方法 要同时获取行和列总计,请执行以下操作:

将numpy导入为np
作为pd进口熊猫
df=pd.DataFrame({'a':[10,20],'b':[100200],'c':['a','b']})
df.loc['Column_Total']=df.sum(仅数值=True,轴=0)
df.loc[:,'Row\u Total']=df.sum(仅数值=真,轴=1)
打印(df)
a b c行总计
0 10.0 100.0 a 110.0
120.0200.0B220.0
列_总计30.0 300.0 NaN 330.0

这不会维护原始数据类型;所有列都转换为对象(从外观上看是字符串)。对不起,你说得对,我没有用字符串列进行检查。现在更新。这几乎是正确的。唯一的问题是数据类型没有得到很好的保留;整数转换为浮点数。幸运的是,我不认为这对我来说是个问题。如果今天没有人发布替代方案,我将接受此解决方案。再次更新以防止汇总数字数据的任何类型更改。字符串现在将在总计行中显示为
np.nan
。这很好。为我工作,谢谢。但是在此之后,我如何将索引更改回指定的列表呢?请尝试使用此链接引用的
df.loc['Total']=df.sum()
!与R非常相似,快速且干净!:-)我怎样才能将总和只指定给特定的列呢?这对我来说很有效,但当我在命令提示符下再次写入df时,它会打印旧的df,而我看不到总和。此外,它不会将总数写入Excel文件
df.loc[:,"Column_Total"] = df.sum(axis=1)