从数据框逐行或按块选择最大/最小值

huangapple go评论59阅读模式
英文:

Select largest/smallest value from data frame line by line or chunk wise

问题

 我们有以下数据框。

 | Val1 | Val2 | H | L | 
 | ---- | ---- | --- | ------ | 
 | 244.2 | 233.05 | H | 无 | 
 | 261.2 | 252.8 | H | 无 | 
 | 242.35 | 235.8 | H | 无 | 
 | 251.1 | 244.55 | H | 无 | 
 | 244.5 | 239.55 | 无 | L | 
 | 271.25 | 262.55 | H | 无 | 
 | 274 | 270.45 | H | 无 | 
 | 245.05 | 236.65 | 无 | L | 
 | 243.35 | 237.55 | 无 | L | 
 | 255.7 | 251.55 | H | 无 | 
 | 248.8 | 243.2 | 无 | L | 
 | 283.75 | 272.15 | H | 无 | 
 | 269.45 | 262.7 | 无 | L | 
 | 260.6 | 254.6 | H | 无 | 
 | 285 | 275 | 无 | L | 
 | 272.5 | 265.35 | 无 | L | 
 | 267 | 254.85 | 无 | L | 
 | 256.65 | 253.5 | 无 | L | 
 | 268 | 257.75 | H | 无 | 
 | 272.1 | 266.75 | H | 无 | 
 | 281.45 | 272.85 | 无 | L | 
 | 288.75 | 282.05 | H | 无 | 
 | 268.75 | 264.5 | 无 | L | 
 | 283 | 275.75 | 无 | L | 
 | 285.95 | 278.15 | H | 无 | 
 | 271.35 | 265.2 | 无 | L | 
 | 308.15 | 300 | H | 无 | 
 | 312.85 | 304.7 | H | 无 | 
 | 311.55 | 302.2 | 无 | L | 
 | 327.4 | 318.65 | H | 无 | 
 | 327 | 319.5 | H | 无 | 
 | 318.7 | 313.9 | 无 | L | 
 | 293.1 | 283.45 | 无 | L | 
 | 306 | 301.5 | H | 无 | 
 | 303.9 | 296.2 | 无 | L | 
 | 293.4 | 261.55 | 无 | L | 
 | 302.8 | 298.1 | H | 无 | 
 | 293.7 | 289.05 | 无 | L | 
 | 267.95 | 264.05 | 无 | L | 
 | 276.55 | 273.2 | H | 无 | 
 | 268.15 | 255 | 无 | L | 
 | 314 | 303.9 | 无 | L | 
 | 324.2 | 311.05 | H | 无 | 
 | 332.35 | 323.8 | H | 无 | 
 | 312.35 | 306.3 | H | 无 | 
 | 308.4 | 300.2 | 无 | L | 
 | 312.5 | 308.55 | 无 | L | 
 | 365.7 | 355.6 | H | 无 | 
 | 334 | 318.8 | H | 无 | 
 | 319.3 | 313.95 | 无 | L | 
 | 327.8 | 323.15 | H | 无 | 

我想要一个数据框,在 H 和 L 值之间交替。但是如框架中所示,一些 H 值在以下时间序列数据中形成了集群。我希望在 H 字段中选择集群中的最高值,在 L 字段中选择集群中的最低值。

输出应如下所示。

 | Val1 | Val2 | H | L | 
 | ------ | ------ | ------ | ------ | 
 | 261.2 | 252.8 | H | 无 | 
 | 244.5 | 239.55 | 无 | L | 
 | 274 | 270.45 | H | 无 | 
 | 245.05 | 236.65 | 无 | L | 
 | 255.7 | 251.55 | H | 无 | 
 | 248.8 | 243.2 | 无 | L | 
 | 283.75 | 272.15 | H | 无 | 
 | 269.45 | 262.7 | 无 | L | 
 | 260.6 | 254.6 | H | 无 | 
 | 256.65 | 253.5 | 无 | L | 
 | 272.1 | 266.75 | H | 无 | 
 | 281.45 | 272.85 | 无 | L | 
 | 288.75 | 282.05 | H | 无 | 
 | 268.75 | 264.5 | 无 | L | 
 | 285.95 | 278.15 | H | 无 | 
 | 271.35 | 265.2 | 无 | L | 
 | 312.85 | 304.7 | H | 无 | 
 | 311.55 | 302.2 | 无 | L | 
 | 327.4 | 318.65 | H | 无 | 
 | 293.1 | 283.45 | 无 | L | 
 | 306 | 301.5 | H | 无 | 
 | 293.4 | 261.55 | 无 | L | 
 | 302.8 | 298.1 | H | 无 | 
 | 267.95 | 264.05 | 无 | L | 
 | 276.55 | 273.2 | H | 无 | 
 | 268.15 | 255 | 无 | L | 
 | 332.35 | 323.8 | H | 无 | 
 | 308.4 | 300.2 | 无 | L | 
 | 365.7 | 355.6 | H | 无 | 
 | 319.3 | 313.95 | 无 | L | 
 | 327.8 | 323.15 | H | 无 | 
英文:

We have the following data frame.

Val1 Val2 H L
244.2 233.05 H None
261.2 252.8 H None
242.35 235.8 H None
251.1 244.55 H None
244.5 239.55 None L
271.25 262.55 H None
274 270.45 H None
245.05 236.65 None L
243.35 237.55 None L
255.7 251.55 H None
248.8 243.2 None L
283.75 272.15 H None
269.45 262.7 None L
260.6 254.6 H None
285 275 None L
272.5 265.35 None L
267 254.85 None L
256.65 253.5 None L
268 257.75 H None
272.1 266.75 H None
281.45 272.85 None L
288.75 282.05 H None
268.75 264.5 None L
283 275.75 None L
285.95 278.15 H None
271.35 265.2 None L
308.15 300 H None
312.85 304.7 H None
311.55 302.2 None L
327.4 318.65 H None
327 319.5 H None
318.7 313.9 None L
293.1 283.45 None L
306 301.5 H None
303.9 296.2 None L
293.4 261.55 None L
302.8 298.1 H None
293.7 289.05 None L
267.95 264.05 None L
276.55 273.2 H None
268.15 255 None L
314 303.9 None L
324.2 311.05 H None
332.35 323.8 H None
312.35 306.3 H None
308.4 300.2 None L
312.5 308.55 None L
365.7 355.6 H None
334 318.8 H None
319.3 313.95 None L
327.8 323.15 H None

I want a data frame which alternates between H and L values. However as seen in the frame, few H values have formed clusters in the following time series data. I want to select the highest value amongst the cluster for H fields and lowest value amongst the cluster for L fields.

The output should look as follows.

Val1 Val2 H L
261.2 252.8 H None
244.5 239.55 None L
274 270.45 H None
245.05 236.65 None L
255.7 251.55 H None
248.8 243.2 None L
283.75 272.15 H None
269.45 262.7 None L
260.6 254.6 H None
256.65 253.5 None L
272.1 266.75 H None
281.45 272.85 None L
288.75 282.05 H None
268.75 264.5 None L
285.95 278.15 H None
271.35 265.2 None L
312.85 304.7 H None
311.55 302.2 None L
327.4 318.65 H None
293.1 283.45 None L
306 301.5 H None
293.4 261.55 None L
302.8 298.1 H None
267.95 264.05 None L
276.55 273.2 H None
268.15 255 None L
332.35 323.8 H None
308.4 300.2 None L
365.7 355.6 H None
319.3 313.95 None L
327.8 323.15 H None

I tried a variety of functions from pandas but cannot get such desired result.

答案1

得分: 1

以下是代码的中文翻译:

# 确保将字符串 'None' 和 NaN 转换为真正的 None
df = df.replace('None', None)

# 标识空值
m1 = df['H'].isna()
m2 = df['L'].isna()

# 创建连续非空值的分组
# 获取每个 H 组的最大 Val1 的行
# 和每个 L 组的最小 Val1 的行
idx = (set(df['Val1'].groupby(m1.cumsum()[~m1]).idxmax())
      | set(df['Val1'].groupby(m2.cumsum()[~m2]).idxmin())
      )

# 索引这些行
out = df.loc[sorted(idx)]

输出结果不需要翻译,因为它已经是中文的代码输出。

英文:

You can use:

# ensure real None/NaN
df = df.replace('None', None)

# identify null values
m1 = df['H'].isna()
m2 = df['L'].isna()

# make groups of consecutive non-null
# get rows with max Val1 per group of H
# and rows with min Val1 per group of L
idx = (set(df['Val1'].groupby(m1.cumsum()[~m1]).idxmax())
      |set(df['Val1'].groupby(m2.cumsum()[~m2]).idxmin())
      )

# index those rows
out = df.loc[sorted(idx)]

Output:

      Val1    Val2     H     L
1   261.20  252.80     H  None
4   244.50  239.55  None     L
6   274.00  270.45     H  None
8   243.35  237.55  None     L
9   255.70  251.55     H  None
10  248.80  243.20  None     L
11  283.75  272.15     H  None
12  269.45  262.70  None     L
13  260.60  254.60     H  None
17  256.65  253.50  None     L
19  272.10  266.75     H  None
20  281.45  272.85  None     L
21  288.75  282.05     H  None
22  268.75  264.50  None     L
24  285.95  278.15     H  None
25  271.35  265.20  None     L
27  312.85  304.70     H  None
28  311.55  302.20  None     L
29  327.40  318.65     H  None
32  293.10  283.45  None     L
33  306.00  301.50     H  None
35  293.40  261.55  None     L
36  302.80  298.10     H  None
38  267.95  264.05  None     L
39  276.55  273.20     H  None
40  268.15  255.00  None     L
43  332.35  323.80     H  None
45  308.40  300.20  None     L
47  365.70  355.60     H  None
49  319.30  313.95  None     L
50  327.80  323.15     H  None

huangapple
  • 本文由 发表于 2023年2月19日 19:11:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/75499699.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定