我有以下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'
的时间
在熊猫中最优雅的方式是什么?
答案 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)