【问题标题】:Resample dataframe with an integer index使用整数索引重新采样数据帧
【发布时间】:2018-09-28 03:49:55
【问题描述】:

我有一个由整数(年龄)索引的数据框(330 行 × 11 列)。我想将数据帧下采样到 97 行。谁能想到一个优雅而简单的方法来实现这一点?

样本数据:

    subsidence1.1   subsidence1.11  subsidence1.12  subsidence1.13  subsidence1.14  subsidence1.15  subsidence1.16  subsidence1.17  subsidence1.18  subsidence1.19  subsidence1.2
age                                         
303.982536  0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000
302.959104  -16.072090  -15.377285  -14.688177  -14.007097  -13.330865  -12.661389  -11.998249  -11.341865  -10.690118  -10.046194  -9.405841
301.947395  -20.178141  -18.767330  -17.372894  -15.990381  -14.623930  -13.268656  -11.927322  -10.599186  -9.284892   -7.981037   -6.691025
300.935685  -24.105568  -21.968602  -19.854874  -17.763423  -15.692894  -13.644213  -11.617834  -9.611091   -7.625165   -5.658335   -3.711900
299.923975  -27.892780  -25.020903  -22.178156  -19.369872  -16.592970  -13.843728  -11.126516  -8.437073   -5.777435   -3.144508   -0.539260
298.912265  -31.562993  -27.947536  -24.375001  -20.842286  -17.351752  -13.900609  -10.488683  -7.114587   -3.778202   -0.477744   2.785826
298.100567  -39.202321  -35.212732  -31.271504  -27.376498  -23.527739  -19.723348  -15.963993  -12.246264  -8.571384   -4.937769   -1.344742
297.888964  -46.722928  -42.359208  -38.049286  -33.791991  -29.585005  -25.427365  -21.320583  -17.259219  -13.245845  -9.279074   -5.356589
296.877373  -50.083382  -44.967299  -39.916886  -34.931039  -30.005863  -25.141908  -20.336060  -15.590047  -10.899534  -6.266525   -1.686869
295.865782  -53.361746  -47.492007  -41.698160  -35.981292  -30.336933  -24.764152  -19.263568  -13.830113  -8.465904   -3.166812   2.067072
294.854191  -56.568517  -49.941151  -43.402492  -36.951362  -30.587567  -24.307742  -18.110565  -11.992692  -5.954436   0.007303    5.892680
293.842600  -59.708739  -52.321161  -45.035074  -37.852737  -30.768427  -23.779991  -16.886848  -10.086845  -3.376732   3.245537    9.781500
292.831009  -62.788359  -54.637342  -46.605512  -38.688092  -30.884265  -23.188478  -15.601343  -8.119917   -0.739700   6.539949    13.720849
291.819418  -65.808873  -56.896600  -48.115167  -39.464029  -30.940535  -22.540796  -14.260980  -6.099704   1.947892    9.881598    17.705631
290.807826  -68.779624  -59.100448  -49.570440  -40.185734  -30.944376  -21.839856  -12.870296  -4.032015   4.680143    13.264523   21.727727
289.796235  -71.698178  -61.255064  -50.976437  -40.859740  -30.899700  -21.092739  -11.434164  -1.919832   7.451046    16.683478   25.783125
288.784644  -74.572221  -63.363381  -52.335479  -41.485496  -30.809202  -20.301245  -9.956993   0.228472    10.256670   20.135201   29.864378
287.773053  -77.400957  -65.426637  -53.650249  -42.071183  -30.678738  -19.471188  -8.442615   2.411406    13.095121   23.612912   33.96932

谢谢

【问题讨论】:

  • 下采样是什么意思?只是随机删除行,所以你最终得到 97 ?还是应该有逻辑?
  • 我不想只是从数据框中随机提取数字或只是将值降至 97。我的索引(年龄)表示我的数据被采样的时间间隔。我想保持范围,但其中的数字较少。
  • 数据框有 330 行。如果我可以重新采样数据框并每隔 10 行取一次,那就太好了。

标签: python pandas dataframe integer resampling


【解决方案1】:

使用np.linspace

df.iloc[np.linspace(0, len(df) - 1, 97).astype(int)]

使用较短数据的示例。

df = pd.DataFrame(np.repeat(np.arange(33)[:, None], 3, axis=1))

# Use 7 to guarantee a length 7 result.
df.iloc[np.linspace(0, len(df) - 1, 7).astype(int)]

     0   1   2
0    0   0   0
5    5   5   5
10  10  10  10
16  16  16  16
21  21  21  21
26  26  26  26
32  32  32  32

【讨论】:

    【解决方案2】:

    如果您想每 10 行取一次(如 cmets 中所述),只需这样做

    df[::10]
    

    【讨论】:

      【解决方案3】:

      只需使用数据框的sample方法

      # assume df is your dataframe
      sample = df.sample(n=97)
      

      【讨论】:

      • 感谢您的建议。这只是从数据框中随机抽取 97 个数字,这不是我想要做的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 2017-11-26
      • 1970-01-01
      • 2022-09-28
      • 2018-08-26
      • 2014-07-04
      • 2021-01-13
      相关资源
      最近更新 更多