2

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

假设我有一个数据框:

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

也就是说,索引为 A、B 和 C 的行。

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

目前我必须这样做:

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

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

4

2 回答 2

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
于 2013-09-05T20:34:06.263 回答
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
于 2013-09-05T21:03:04.403 回答