如何在Pandas数据帧中插入求和行时保留列标题

时间:2018-03-21 13:04:30

标签: python pandas dataframe indexing

我有一个数据框:

       Name    y1    y2   y3                  
 1     Ben     01    02   03
 2     Jane    04    05   06
 3     Sarah   07    07   06

我试图在我的数据框中添加一行,它提供了每列中的总行数。我的代码是:

import pandas as pd

df = pd.DataFrame(np.insert(df.values, 0, values=[df.sum(axis=0)], axis=0))
df.set_value(0, 0,'total')
df.head()

这是成功的,但也会删除我的列名:

       0       1     2    3                     
 0     Total   12    14   15
 1     Ben     01    02   03
 2     Jane    04    05   06
 3     Sarah   07    07   06

而不是按照需要返回:

       Name    y1    y2   y3                      
 0     Total   12    14   15
 1     Ben     01    02   03
 2     Jane    04    05   06
 3     Sarah   07    07   06

我试过插入

Index(['Name'], name=df.index.name)

df = pd.DataFrame(np.insert(df.values, 0, values=[df.sum(axis=0)], Index(['Name'], name=df.index.name) axis=0))

但这只会返回错误

  

TypeError:不可用类型:'索引'

我哪里错了?

5 个答案:

答案 0 :(得分:2)

避免这种情况的一种方法是通过argumentList <- split(df, col(df)) # create a list of arguments names(argumentList)[1] <- "x" # name at least one of the inputs for the default value x argumentList["na.rm"] <- TRUE # add any other arguments needed do.call( myFunction, argumentList ) 添加新行,然后将其移至顶部:

.loc

如果这对您很重要,您可以使用df.loc[len(df)+1] = ['Total'] + df.iloc[:, 1:].sum(axis=0).tolist() df = df.loc[[df.index[-1]] + df.index[:-1].tolist(), :] # Name y1 y2 y3 # 4 Total 12 14 15 # 1 Ben 1 2 3 # 2 Jane 4 5 6 # 3 Sarah 7 7 6

答案 1 :(得分:2)

IIUC,你可以这样做,使用select_typesassignpd.concat

pd.concat([df.select_dtypes(include=np.number)
             .sum()
             .to_frame()
             .T
             .assign(Name='Total'),df])

输出:

    Name  y1  y2  y3
0  Total  12  14  15
1    Ben   1   2   3
2   Jane   4   5   6
3  Sarah   7   7   6

答案 2 :(得分:1)

您可以使用{1=>[GameObject1], 2=>[GameObject3, GameObject4], 3=>[GameObject2] ...} 来堆叠两个数据帧:

pandas.concat

答案 3 :(得分:1)

你可以尝试

s=df.sum()    
s.loc['Name']='Total'
df.loc[0]=s    
df.sort_index()
Out[457]: 
    Name  y1  y2  y3
0  Total  12  14  15
1    Ben   1   2   3
2   Jane   4   5   6
3  Sarah   7   7   6

答案 4 :(得分:1)

使用np.insert的解决方案应该非常快,但必须首先使用非数字列创建index

#create index from `Name` column
df = df.set_index('Name')

#add first value to index
idx = np.insert(df.index, 0, 'Total')
#add columns and index parameters to DataFrame contructor and last reset index
df = pd.DataFrame(np.insert(df.values, 0, df.sum(), axis=0), 
                  columns=df.columns, 
                  index=idx).reset_index()
print (df)
    Name  y1  y2  y3
0  Total  12  14  15
1    Ben   1   2   3
2   Jane   4   5   6
3  Sarah   7   7   6