将系列作为行数据框架Pandas附加(Python 3.4)

时间:2016-03-03 22:13:33

标签: python pandas

假设我有一个数据框,如:

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?

3 个答案:

答案 0 :(得分:0)

不确定原因,但稍有改动。

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

希望有所帮助!

答案 1 :(得分:0)

您必须将categoriesTotal类别设为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