2016-03-03 48 views
1

假设我有一个数据帧,如:追加一个系列作为行数据帧熊猫(Python的3.4)

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 

我想追加一个“汇总”行对于数字列,并将在“汇总”在列E.

所以我有什么是:

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

不知道为什么,但略有改变。

total = df2.sum() 
total = total.append(pd.Series('Total', index=['E'])) 
df2.append(total, True) 

希望有帮助!

+0

它不适合我。 – jezrael

0

你必须设置categories与类别Totalcategories=["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 
0

首先,除非它是现有类别(即“测试”或“火车”),否则您将在列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