假设我有一个数据框,如:
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]), })
这看起来像
A B C D E
0 1 2013-01-02 1 3 test
1 1 2013-01-02 1 3 train
2 1 2013-01-02 1 3 test
3 1 2013-01-02 1 3 train
我想为数字列添加“Totals”行,并在E列中输入“Totals”。
所以我拥有的是:
totals=pd.Series('Total', index=['E'])
totals = df2.sum(numeric_only=True).append(totals)
产生
totals
A 4
C 4
D 12
E Total
dtype: object
所以,如果我尝试
df2.append(totals, ignore_index=True)
我得到了
A B C D E
0 1 2013-01-02 00:00:00 1 3 test
1 1 2013-01-02 00:00:00 1 3 train
2 1 2013-01-02 00:00:00 1 3 test
3 1 2013-01-02 00:00:00 1 3 train
4 4 NaN 4 12 NaN
我的问题是为什么列'E'没有“总数”,为什么不是NaN?
答案 0 :(得分:0)
不确定原因,但稍有改动。
total = df2.sum()
total = total.append(pd.Series('Total', index=['E']))
df2.append(total, True)
希望有所帮助!
答案 1 :(得分:0)
您必须将categories
与Total
类别设为categories=["test","train","Total"]
。
我认为你得到NaN
,因为这个类别不存在。
import pandas as pd
import numpy as np
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"],
categories=["test","train","Total"])})
totals=pd.Series('Total', index=['E'])
totals = df2.sum(numeric_only=True).append(totals)
print df2.append(totals, True)
A B C D E
0 1 2013-01-02 1 3 test
1 1 2013-01-02 1 3 train
2 1 2013-01-02 1 3 test
3 1 2013-01-02 1 3 train
4 4 NaT 4 12 Total
答案 2 :(得分:0)
首先,除非是现有类别(即' test'或' train'),否则您将在E栏中获得NaN。首先,我们必须将新值Total
添加到类别中,然后将结果重新分配回列。
执行此操作后,您的原始方法将起作用。但是,我认为这是一种更直接的方法:
df2['E'] = df2.E.cat.add_categories('Total')
df2.ix[len(df2)] = df2.sum()
df2.iat[-1, -1] = 'Total'
>>> df2
A B C D E
0 1 2013-01-02 1 3 test
1 1 2013-01-02 1 3 train
2 1 2013-01-02 1 3 test
3 1 2013-01-02 1 3 train
4 4 NaT 4 12 Total