对列标题值(而不是日期时间)重采样Pandas DataFrame

4ioopgfo  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

我有一个Pandas DataFrame,每行包含光谱。索引是时间戳,列标题包含x轴值,y轴值存储在DataFrame中。
我想通过对几个测量波长进行平均来降低光谱分辨率以有利于信噪比。在下面的数据中,原始分辨率为10,我想将其降低到例如40。这意味着对于每个光谱,列400,410,420,例如,列430中的值需要被平均并放入名称为415的列中,列440、450、460、470中的值需要被平均并放入名称为455的列中,等等。
我熟悉函数pd.resample(),但它似乎只在时域中工作,因为当我用axis=1rule=40尝试它时,我得到ValueError: Invalid frequency
如何着手解决这个问题呢?


的数据
虚拟 Dataframe 的代码

#%% Import packages
import numpy as np
import pandas as pd

#%% Make dummy DataFrame
timestamps = pd.date_range('2023-11-07T15:00', '2023-11-07T15:10', freq='60s')
columns = np.arange(400, 1337, 10)
dummy_data = np.random.rand(len(rows), len(columns))
df_data = pd.DataFrame(dummy_data, index=timestamps, columns=columns)

字符串

btqmn9zl

btqmn9zl1#

您可以为不是时间戳的更一般的间隔创建IntervalIndex对象,然后使用它在列中创建bin。

import numpy as np
import pandas as pd

timestamps = pd.date_range('2023-11-07T15:00:00', '2023-11-07T15:10:00', freq='60s')
step = 10
columns    = np.arange(400, 1337, step)
dummy_data = np.random.rand(len(timestamps), len(columns))
df_data    = pd.DataFrame(dummy_data, index=timestamps, columns=columns)

# answer starts 
freq = 40
ii = pd.interval_range(start=df_data.columns.min(),
                       freq=freq,
                       periods=(df_data.pipe(lambda x: x.columns.max()-x.columns.min()) // freq) + 1,
                       closed="left"
                      )

df_data.set_axis(ii[ii.get_indexer(df_data.columns)], axis=1)\
     .groupby(axis=1, level=0).mean().rename(columns=lambda x: (x.left + x.right - step) // 2)

字符串
| | 455 | 495 | 535 | 575 | 615 | 655 | 695 | 735 | 775 | 815 | 855 | 895 | 935 | 975 | 1015 | 1055 | 1095 | 1135 | 1175 | 1215 | 1255 | 1295 | 1335 | 1335 |
| --|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
| 2023-11-07 15:00:00| 0.430524| 0.521639| 0.542988| 0.488163| 0.572261| 0.525476| 0.521687| 447381| 0.486063| 0.241195| 0.56868| 0.777673| 0.461639| 0.494696| 0.612861| 0.199416| 0.720727| 0.322228| 0.306663| 0.694246| 0.58521| 0.573232| 0.501292| 0.83813|
| 2023-11-07 15:01:00| 0.710228| 0.456594| 0.504776| 0.546193| 0.505814| 0.617826| 322141| 0.74073| 423447| 0.44125| 436631| 430491| 456306| 0.696293| 0.592248| 0.597835| 0.569999| 0.6247| 0.338119| 0.626863| 214226| 0.488864| 0.455883| 433434|
| 2023-11-07 15:02:00| 45061| 0.343134| 0.47586| 0.633249| 0.441403| 0.400273| 0.473019| 0.53869| 404705| 0.456827| 0.533389| 0.582856| 0.431298| 0.488818| 0.545776| 0.232522| 0.767286| 0.432049| 235096| 0.544261| 0.677255| 0.596968| 0.542493| 0.453763|
| 2023-11-07 15:03:00| 0.500934| 0.494954| 0.565269| 0.385644| 0.564638| 0.586023| 0.530071| 0.670653| 0.252507| 0.58376| 0.574861| 0.714097| 309771| 0.474184| 0.679437| 0.637876| 0.529004| 0.572173| 0.697919| 0.464588| 0.617603| 0.377916| 0.266023| 0.379837|
| 2023-11-07 15:04:00| 452541| 421196| 0.367973| 0.480072| 0.632745| 0.337648| 0.147384| 0.576814| 0.638796| 49309| 412712| 0.44052| 0.350567| 0.742641| 0.467432| 63406| 0.484756| 0.558782| 459106| 42711| 0.544598| 0.727806| 0.297389| 0.72747|

相关问题