pandas groupby返回min()以及min()发生的时间

2024-09-25 18:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据组织在多索引数据帧中。我试图按“扫描”索引分组,并返回特定时间范围内的最小值(或最大值),以及该时间发生的时间。在

数据看起来像:

             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()(即峰值)返回这些值出现的时间点?在


Tags: 数据方法ledtime时间maxsecondarybl
2条回答

我不知道这是否适用于您的多索引框架,但值得一试;使用:

>>> df
  tag       tick  val
z   C 2014-09-07   32
y   C 2014-09-08   67
x   A 2014-09-09   49
w   A 2014-09-10   80
v   B 2014-09-11   51
u   B 2014-09-12   25
t   C 2014-09-13   22
s   B 2014-09-14    8
r   A 2014-09-15   76
q   C 2014-09-16    4

使用idxmax查找索引器,然后使用.loc

^{pr2}$

可以考虑在groupby中使用transform函数。如果你的数据有点像这样:

import pandas as pd
sweep =     ["sweep1", "sweep1", "sweep1", "sweep1", 
            "sweep2", "sweep2", "sweep2", "sweep2",
            "sweep3", "sweep3", "sweep3", "sweep3",
            "sweep4", "sweep4", "sweep4", "sweep4"]
Time =      [0.009845, 0.002186,  0.006001,  0.00265,  
            0.003832,  0.005627,  0.002625,  0.004159,  
            0.00388,  0.008107,  0.00813,  0.004813, 
            0.003205,  0.003225,  0.00413,  0.001202]
Primary =   [-2832.013203,  -2478.839133,  -2100.671551,  -2057.188346,  
             -2605.402055,  -2030.195497,  -2300.209967,  -2504.817095,  
             -2865.320903,  -2456.0049,  -2542.132906,  -2405.657053,  
             -2780.140743,  -2351.743053,  -2232.340363,  -2820.27356]
s_count =   [ 0, 1, 2, 3,
              0, 1, 2, 3,
              0, 1, 2, 3,
              0, 1, 2, 3]

df = pd.DataFrame({ 'Time'      : Time,
                    'Primary'   : Primary}, index = [sweep, s_count])

然后您可以编写一个非常简单的转换函数,它将为每一组数据(按扫描索引分组)返回“Primary”最小值所在的行。这可以用简单的布尔切片来实现。应该是这样的:

^{pr2}$

然后要使用此函数,只需在transform方法中调用它:

df.groupby(level = 0).transform(trans_function)

这给了我以下的输出:

              Primary      Time
sweep1 0 -2832.013203  0.009845
sweep2 0 -2605.402055  0.003832
sweep3 0 -2865.320903  0.003880
sweep4 3 -2820.273560  0.001202

显然,如果您需要的话,您可以将它合并到对数据的某个子集起作用的函数中。在

另一种方法是使用argmin()函数为组编制索引。我试图用transform来实现这个目的,但它只是返回整个数据帧。我不知道为什么会这样,但是它确实可以与apply一起工作:

def trans_function2(df):
    return df.loc[df['Primary'].argmin()]

df.groupby(level = 0).apply(trans_function2)

这又给了我:

            Primary      Time
sweep1 -2832.013203  0.009845
sweep2 -2605.402055  0.003832
sweep3 -2865.320903  0.003880
sweep4 -2820.273560  0.001202

我不太清楚为什么这个函数不能与transform一起工作,也许有人会启发我们。在

相关问题 更多 >