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)