我的数据组织在多索引数据帧中。我试图按“扫描”索引分组,并返回特定时间范围内的最小值(或最大值),以及该时间发生的时间。在
数据看起来像:
Time Primary Secondary BL LED
Sweep
Sweep1 0 0.00000 -28173.828125 -0.416565 -0.000305
1 0.00005 -27050.781250 -0.416260 0.000305
2 0.00010 -27490.234375 -0.415955 -0.002441
3 0.00015 -28222.656250 -0.416260 0.000305
4 0.00020 -28759.765625 -0.414429 -0.002136
得到最小值或最大值非常简单。在
^{pr2}$给出(部分输出):
Sweep
Sweep1 -92333.984375
Sweep10 -86523.437500
Sweep11 -85205.078125
Sweep12 -87109.375000
Sweep13 -77929.687500
但我也需要找出那些峰值出现的时间。我知道我可以迭代输出并找到这些值在原始数据集中出现的位置,但这似乎是一种非常暴力的方法。我还可以编写一个不同的函数来应用于分组对象,返回max和max发生的时间(至少在理论上-没有尝试过这样做,但我认为它非常简单)。在
除了这两个选项,还有没有更简单的方法来传递分组.Primary.min()(即峰值)返回这些值出现的时间点?在
我不知道这是否适用于您的多索引框架,但值得一试;使用:
使用
^{pr2}$idxmax
查找索引器,然后使用.loc
:可以考虑在groupby中使用transform函数。如果你的数据有点像这样:
然后您可以编写一个非常简单的转换函数,它将为每一组数据(按扫描索引分组)返回“Primary”最小值所在的行。这可以用简单的布尔切片来实现。应该是这样的:
^{pr2}$然后要使用此函数,只需在
transform
方法中调用它:这给了我以下的输出:
显然,如果您需要的话,您可以将它合并到对数据的某个子集起作用的函数中。在
另一种方法是使用
argmin()
函数为组编制索引。我试图用transform来实现这个目的,但它只是返回整个数据帧。我不知道为什么会这样,但是它确实可以与apply
一起工作:这又给了我:
我不太清楚为什么这个函数不能与
transform
一起工作,也许有人会启发我们。在相关问题 更多 >
编程相关推荐