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']
我开发了一个需要校准 >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']