【问题标题】:Best way to downsample (reduce sample rate) non time series data in Pandas在 Pandas 中下采样(降低采样率)非时间序列数据的最佳方法
【发布时间】:2021-11-21 18:03:20
【问题描述】:

我有一个数据框,其中包含每 0.01 米收集到地下的数据。由于其高分辨率,数据集的最终大小非常大。 pandas 有没有办法将采样间隔降低到 5m 从而减小数据集的大小?

结果(每 0.01m)

Depth_m value
1.34 31.7
1.35 31.7
1.36 31.7
1.37 31.9
1.38 31.9
1.39 31.9
1.40 31.9
.... .....
44.35 32.9
44.36 32.9
44.37 32.9

我想要的结果(每 5m)

Depth_m value
5.47 31.7
10.49 31.7
15.51 31.7
20.53 31.9
25.55 31.9
30.57 31.9
35.59 31.9
40.61 31.9
45.63 31.9

我曾尝试使用pandas.resample,但这似乎只适用于时间序列数据。我想我明白我必须做什么,但不知道如何在熊猫中做到这一点。基本上我在想我需要计算当前的采样率是多少,在这种情况下是 0.01m。那么每5m有多少个观测值。然后我可以根据观察次数平均这些值并删除行。每 5m 循环一次这个过程。

【问题讨论】:

  • 我投了反对票,因为:问题不可重现,包含数字数据作为图像,没有显示任何解决问题的尝试。
  • 抱歉第一次发帖试图让它更清楚

标签: python pandas dataframe


【解决方案1】:

整数值没有resample。作为一种解决方法,您可以将深度四舍五入到最接近的 5 并使用groupby 来获取每 5m 深度的平均值:

>>> df.groupby(df["Depth_m"].apply(lambda x: 5*round(x/5)))["Value"].mean()
Depth_m
0     34.256410
5     34.274549
10    34.564870
15    34.653307
20    34.630739
25    34.517034
30    34.584830
35    34.581162
40    34.620758
45    34.390374
Name: Value, dtype: float64
输入df:
import numpy as np
np.random.seed(100)

df = pd.DataFrame({"Depth_m": [i/100 for i in range(134, 4438)],
                   "Value": np.random.randint(30, 40, size=4304)})

【讨论】:

    【解决方案2】:

    您可以使用 Panda 的 .ilocselection by position 加上 slice object 进行下采样。在从非整数样本间隔转换时,必须注意确保您具有整数步长而不是浮点数(因此使用astype("int"))。

    import numpy as np
    import pandas as pd
    
    sequence_interval = 0.01
    downsampled_interval = 5
    step_size = np.round(downsampled_interval / sequence_interval).astype("int")
    
    df = pd.DataFrame(
        {
            "Depth_m": np.arange(131, 4438) / 100,
            "value": np.random.random(size=4307),
        }
    )
    
    downsampled_df = df.iloc[::step_size, :]
    print(downsampled_df)
    

    结果是

          Depth_m     value
    0        1.31  0.357536
    500      6.31  0.384327
    1000    11.31  0.302109
    1500    16.31  0.200971
    2000    21.31  0.689973
    2500    26.31  0.712869
    3000    31.31  0.776306
    3500    36.31  0.221901
    4000    41.31  0.661378
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 2014-07-24
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多