熊猫:用它们的总和替换一组行

时间:2013-09-05 20:09:33

标签: python pandas

我确信有一种巧妙的方法可以做到这一点,但还没有找到任何运气。

假设我有一个数据框:

f = pd.DataFrame({'A':[1, 2, 3, 4], 'B': [10, 20, 30, 40], 'C':[100, 200, 300, 400]}).T

即行,索引为A,B和C.

现在假设我想要获取行A和B,并将它们替换为一行,即它们的总和;而且,我想将一个给定的索引(比如'sum')分配给那个替换行(注意索引的顺序无关紧要)。

目前我不得不这样做:

f.append(pd.DataFrame(f.ix[['A','B']].sum()).T).drop(['A','B'])

后面跟一些同样笨重的东西来设置替换行的索引。但是,我很想知道是否有一种优雅,单行的方式来完成这两个步骤?

2 个答案:

答案 0 :(得分:3)

这样做:

In [79]: f.append(f.loc[['A', 'B']].sum(), ignore_index=True).drop([0, 1]).set_index(Index(['C', 'sumAB'])
)
Out[79]:
         0    1    2    3
C      100  200  300  400
sumAB   11   22   33   44

或者你可以使用Index.get_indexer来表示更加丑陋的单行:

In [96]: f.append(f.loc[['A', 'B']].sum(), ignore_index=True).drop(f.index.get_indexer(['A', 'B'])).set_index(Index(['C', 'sumAB']))
Out[96]:
         0    1    2    3
C      100  200  300  400
sumAB   11   22   33   44

答案 1 :(得分:1)

另一种选择是使用concat

In [11]: AB = list('AB')

首先选择您要求和的行:

In [12]: f.loc[AB]
Out[12]: 
    0   1   2   3
A   1   2   3   4
B  10  20  30  40

In [13]: f.loc[AB].sum()
Out[13]: 
0    11
1    22
2    33
3    44
dtype: int64

并作为DataFrame 中的一行(注意:在将来的版本中可能不需要此步骤......)

In [14]: pd.DataFrame({'sumAB': f.loc[AB].sum()}).T
Out[14]: 
        0   1   2   3
sumAB  11  22  33  44

我们希望与剩下的所有行连接:

In [15]: f.loc[f.index - AB]
Out[15]: 
     0    1    2    3
C  100  200  300  400

In [16]: pd.concat([pd.DataFrame({'sumAB': f.loc[AB].sum()}).T,
                        f.loc[f.index - AB]],
                   axis=0)
Out[16]: 
         0    1    2    3
sumAB   11   22   33   44
C      100  200  300  400