我确信有一种巧妙的方法可以做到这一点,但还没有找到任何运气。
假设我有一个数据框:
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'])
后面跟一些同样笨重的东西来设置替换行的索引。但是,我很想知道是否有一种优雅,单行的方式来完成这两个步骤?
答案 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