查找 pandas 数据列中的最小值/最大值,中间有 nans

问题描述 投票:0回答:1

我有一个 pandas 数据框,其中有一列名为“Outside Dead Band”,数据以 32Hz(每秒 32 个数据点)记录。

我想遵循以下算法。

  1. 在数据列的2个nan之间,检查
    1. 无nan的持续时间

      1. 如果持续时间超过2秒

        1. 如果 nan 之间的值为正,则取最大值,并将其附加到名为机动的列表中。

        2. 如果 nan 之间的值为负数,则取最小值,并将其附加到名为机动的列表中。

      2. 如果持续时间少于2秒

        1. 如果 nan 之间的值为正,则取最大值,并将其附加到名为 gusts 的列表中。

        2. 如果 nan 之间的值为负数,则取最小值,并将其附加到名为 gusts 的列表中。

示例:

Example 1

Data Snippet

 NaN 
 NaN 
 NaN 
 NaN 
0.935829
 NaN 
 NaN 
0.9468344
 NaN 
0.9352744
 NaN 
0.9299145
 NaN 
0.9159902
 NaN 
0.9189067
0.9447504
 NaN 
 NaN 
0.9488161

Expected Outputs

gusts = [0.935829, 0.9468344, 0.9352744, 0.9299145, 0.9159902, 0.9159902, 0.9447504, 0.9488161]
Example 2

Data Snippet

 NaN 
 NaN 
1.066175
1.108567
1.103931
1.098653
1.094846
1.062542
1.053064
 NaN 
 NaN
0.9460738
0.931207
0.9161806
0.9083371
0.9201323
0.9272887
0.9176005
0.9021356
0.9303108
0.9178913
0.8911541
0.8558757
0.8634101
0.828901
0.8187609
0.8117134
0.8005729
0.7740957
0.7548033
0.7564046
0.7697771
0.7818314
0.7997488
0.8270378
0.8616151
0.8802456
0.9116527
0.9257826
0.9388146
0.945994
0.9453149
0.9454532
0.9426287
0.928901
0.9325082
0.9312031
0.9289232
0.916741
0.9420649
0.9212928
0.922505
0.9238197
0.9236084
0.8717794
0.8492894
0.8158376
0.7905051
0.7699976
0.747136
0.7314162
0.7468339
0.7403114
0.7393804
0.7492437
0.7990298
0.818364
0.8724768
0.947295
0.9460738
0.931207
0.9161806
0.9083371
0.9201323
0.9272887
0.9176005
0.9021356
0.9303108
0.9178913
0.8911541
0.8558757
 NaN
 NaN 
 NaN 
1.055898
 NaN

Expected Outputs

gusts = [1.108567, 1.055898]
maneuvers = [0.947295]
Example 3

Data Snippet

 NaN 
 NaN 
-1.066175
-1.108567
-1.103931
-1.098653
-1.094846
-1.062542
-1.053064
 NaN 
 NaN
-0.9460738
-0.931207
-0.9161806
-0.9083371
-0.9201323
-0.9272887
-0.9176005
-0.9021356
-0.9303108
-0.9178913
-0.8911541
-0.8558757
-0.8634101
-0.828901
-0.8187609
-0.8117134
-0.8005729
-0.7740957
-0.7548033
-0.7564046
-0.7697771
-0.7818314
-0.7997488
-0.8270378
-0.8616151
-0.8802456
-0.9116527
-0.9257826
-0.9388146
-0.945994
-0.9453149
-0.9454532
-0.9426287
-0.928901
-0.9325082
-0.9312031
-0.9289232
-0.916741
-0.9420649
-0.9212928
-0.922505
-0.9238197
-0.9236084
-0.8717794
-0.8492894
-0.8158376
-0.7905051
-0.7699976
-0.747136
-0.7314162
-0.7468339
-0.7403114
-0.7393804
-0.7492437
-0.7990298
-0.818364
-0.8724768
-0.947295
-0.9460738
-0.931207
-0.9161806
-0.9083371
-0.9201323
-0.9272887
-0.9176005
-0.9021356
-0.9303108
-0.9178913
-0.8911541
-0.8558757
 NaN
 NaN 
 NaN 
-1.055898
 NaN

Expected Outputs

gusts = [-1.108567, -1.055898]
maneuvers = [-0.947295]

我尝试隔离循环并使用 for 循环和一系列 if 和 else 语句,但我的逻辑似乎不正确。如果可能的话,我真的很感激数据框本身对此的一些帮助。

norm_accel = flight["Outside Dead Band"].tolist()
gusts = []
maneuvers = []
while i <= (len(norm_accel)):
    if norm_accel[i] != numpy.nan:
        if norm_accel[i+1] == numpy.nan:
            gusts.append(norm_accel(i))
        else:
            j = i
            counter = 0
        while norm_accel[j] != numpy.nan:
            counter =+ 1
            j =+ 1
        if counter >= 64:
            maneuvers.append(max(norm_accel[i:j]))
        else:
            gusts.append(max(norm_accel[i:j]))
        i = j
    i = i + 1

我确实知道这并不能解释最大最小条件,我不知道如何合并它。

python pandas dataframe analytics
1个回答
0
投票

我会将其放入 pandas 数据框中,并使用 NaN 的出现来创建一个

id
列,然后您可以使用该列进行分组并计算相关统计数据。假设
data
是一个数据框,其值位于
val
列中,它可能看起来像:

data["id"] = data["val"].isna().cumsum()
data = data.dropna()
grps = data.groupby("id").agg(
    counts=("val", "count"),
    min=("val", "min"),
    max=("val", "max"),
)
grps

使用示例 2 可以得到:

    counts       min       max
id                            
2        7  1.053064  1.108567
4       70  0.731416  0.947295
7        1  1.055898  1.055898

然后您可以使用简单的规则来创建列表:

grps["val"] = np.where(grps["max"] > 0, grps["max"], grps["min"])
manuevers = grps.loc[grps.counts >= 64, "val"].tolist()
gusts = grps.loc[grps.counts < 64, "val"].tolist()
© www.soinside.com 2019 - 2024. All rights reserved.