Pandas 函数向量化

Pandas function vectorization

我开发了一个需要校准 >100 万数据的程序,我想对其进行矢量化以提高时间性能。

我有一个包含列的数据框:['time','raw_data'],我想用校准后的数据创建一个新列

我有另一个数据框,其中包含校准数据。数据框按列组织:['calibration_name'、'raw_value'、'calibrated_value']

现在我开发了一个检索 calibrated_value 的函数,我可以使用 apply 方法来这样做:

def calibrate(value, calibration):
    df_calibrations = pd.read_csv('calibration_data.csv', usecols=['calibration_name', 'raw_value', 'calibrated_value'])
    y_out = df_calibrations.loc[df_calibrations ['calibration_name'] == value]['calibrated_value'].iloc[0]


df = pd.read_csv('data_to_calibrate.csv', usecols=['time', 'raw'])
calibration = 'calibration_name'
df['eng'] = df['raw'].apply(calibrate, calibration=calibration)

现在我的代码工作正常,但我想提高性能,所以我决定矢量化为:

df['eng'] = calibrate(df['raw'], calibration)

但是我收到如下错误:

('Lengths must match to compare', (11,), (7630,))

我想不出一个矢量化线的解决方案:

y_out = df_calibrations.loc[df_calibrations ['calibration_name'] == value]['calibrated_value'].iloc[0]

有办法吗?

data_to_calibrate.csv:

time,   raw
1571348671638000000,    1
1571348676493000000,    3
1571348681180000000,  2

calibration_data.csv:

calibration_name,  raw_value,   raw_value
XXXX01  0   A
XXXX01  1   B
XXXX01  2   C
XXXX01  3   D

通过合并公共列,您可以以矢量化方式执行所有必要的业务逻辑

data_to_calibrate = data_to_calibrate.merge(calibration_data, how='left', left_on='raw', right_on='raw_value')

data_to_calibrate.loc[data_to_calibrate['raw_value'].notna(), 'time'] = data_to_calibrate['raw_value']