【问题标题】:How can I split pandas dataframe into groups of peaks如何将熊猫数据框拆分为峰值组
【发布时间】:2021-05-10 03:32:48
【问题描述】:

我正在尝试分析的 Excel 文件中有一个数据集。

示例数据:

Time in s  Displacement in mm    Force in N
          0                   0  Not Relevant
          1                   1  Not Relevant
          2                   2  Not Relevant
          3                   3  Not Relevant
          4                   2  Not Relevant
          5                   1  Not Relevant
          6                   0  Not Relevant
          7                   2  Not Relevant
          8                   3  Not Relevant
          9                   4  Not Relevant
         10                   5  Not Relevant
         11                   6  Not Relevant
         12                   5  Not Relevant
         13                   4  Not Relevant
         14                   3  Not Relevant
         15                   2  Not Relevant
         16                   1  Not Relevant
         17                   0  Not Relevant
         18                   4  Not Relevant
         19                   5  Not Relevant
         20                   6  Not Relevant
         21                   7  Not Relevant
         22                   6  Not Relevant
         23                   5  Not Relevant
         24                   4  Not Relevant
         24                   0  Not Relevant

从 xls 文件导入,然后绘制时间与位移的关系图:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel(
    'DATA.xls',
    engine='xlrd', usecols=['Time in s', 'Displacement in mm', 'Force in N'])


fig, ax = plt.subplots()
ax.plot(df['Time in s'], df['Displacement in mm'])

ax.set(xlabel='Time (s)', ylabel='Disp',
       title='time disp')
ax.grid()

fig.savefig("time_disp.png")
plt.show()

我想将数据分成多个组分别进行分析。 因此,如果我根据时间绘制位移,我会得到一个sawtooth,因为正在循环加载样本。

我想拆分数据,以便每个“牙齿”都是自己的组或数据集,以便我可以分析每个周期

谁能帮忙?

【问题讨论】:

标签: python pandas matplotlib graph statistics


【解决方案1】:

您可以创建一个列组,其值在每个局部最小值处发生变化。首先在局部最小值处获得 True 并使用两个 diff 一次向前和一次向后。然后每次有局部最小值时使用cumsum 增加组数。

df['gr'] = (~(df['Deplacement'].diff(1)>0) 
             & ~(df['Deplacement'].diff(-1)>0)).cumsum()
print(df)
    Time  Deplacement  gr
0      0            0   1
1      1            1   1
2      2            2   1
3      3            3   1
4      4            2   1
5      5            1   1
6      6            0   2
7      7            2   2
8      8            3   2
9      9            4   2
10    10            5   2
11    11            6   2
12    12            5   2
13    13            4   2
14    14            3   2
15    15            2   2
16    16            1   2
17    17            0   3
18    18            4   3
19    19            5   3

您可以通过单独选择每个组来拆分数据,或者您可以使用循环执行某些操作并在每个循环中执行您想要的任何操作。

s = (~(df['Deplacement'].diff(1)>0) 
      & ~(df['Deplacement'].diff(-1)>0)).cumsum()
for _, dfg in df.groupby(s):
    print(dfg)
    # analyze as needed

编辑:如果您的问题中的数据至少为 0,那么执行 df['gr'] = df['Deplacement'].eq(0).cumsum() 也可以,但它特定于最小值正好为 0

【讨论】:

  • 我无法理解您建议的代码的逻辑。它对应用程序非常有效,我只是在试验,想看看如果我也可以将它分成最小-最大、最大-最小,我的数据会是什么样子。所以基本上把锯齿的每一个“齿”分为上升部分和下降部分
  • @frogbutt 所以局部最小值是当一个点小于前一个点且小于下一个点时,因此使用diff。我做>0 但使用~ 会反转结果,所以~...>0 将等同于...<0。但我知道我为了避免边界效应而过度复杂了答案,这并不是真正必要的。要分割每颗牙齿,请尝试像这样df['gr'] = ( ( (df['Deplacement'].diff(1)<0)&(df['Deplacement'].diff(-1)<0)) |( (df['Deplacement'].diff(1)>0)&(df['Deplacement'].diff(-1)>0)) ).cumsum()。如果您需要更多解释,请告诉我,我会尝试编辑答案:)
猜你喜欢
  • 2017-11-27
  • 2018-04-26
  • 2019-05-29
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2023-03-21
相关资源
最近更新 更多