在.groupby()之后更新组内的pandas.DataFrame

时间:2015-11-06 00:12:57

标签: python pandas

我有以下pandas.DataFrame

                                                          time
offset   ts                      op                           
0.000000 2015-10-27 18:31:40.318 BuildIndex            282.604
                                 Compress              253.649
                                 Decompress              2.953
                                 Deserialize             0.063
                                 InsertIndex             1.343
4.960683 2015-10-27 18:36:37.959 BuildIndex            312.249
                                 Compress              280.747
                                 Decompress              2.844
                                 Deserialize             0.110
                                 InsertIndex             0.907

现在我需要更新数据框(就地可以):对于每个组,从同一组中的op == 'Compress' - 中减去op == 'BuildIndex'的时间

在熊猫中最优雅的方式是什么?

3 个答案:

答案 0 :(得分:3)

我使用xs(横截面)来执行此操作:

In [11]: df1.xs("Compress", level="op")
Out[11]:
                                     time
offset   ts
0.000000 2015-10-27 18:31:40.318  253.649
4.960683 2015-10-27 18:36:37.959  280.747

In [12]: df1.xs("BuildIndex", level="op")
Out[12]:
                                     time
offset   ts
0.000000 2015-10-27 18:31:40.318  282.604
4.960683 2015-10-27 18:36:37.959  312.249

In [13]: df1.xs("BuildIndex", level="op") - df1.xs("Compress", level="op")
Out[13]:
                                    time
offset   ts
0.000000 2015-10-27 18:31:40.318  28.955
4.960683 2015-10-27 18:36:37.959  31.502

减法适用于索引标签(在本例中为offset和ts),因此无需分组。

答案 1 :(得分:0)

非常感谢! .xs()解决了这个问题。以下是我如何使用它:

diff = df.xs("BuildIndex", level="op") - df.xs("Compress", level="op")
diff['op'] = 'BuildIndex'
diff = diff.reset_index().groupby(['offset', 'ts', 'op']).agg(lambda x: x)
df.update(diff)

但是代码看起来很丑陋。有人可以建议更优雅的解决方案吗?

答案 2 :(得分:0)

找到最优雅的解决方案!只需三行代码:

df = df.unstack("op")
df['time', 'BuildIndex'] -= df['time', 'Compress']
df = df.stack()

(这是Discussion