【发布时间】:2021-11-04 20:41:46
【问题描述】:
我有两个不同长度的数据框。 dfSamples(63012375 行)和 dfFixations(200000 行)。
dfSamples = pd.DataFrame({'tSample':[4, 6, 8, 10, 12, 14]})
dfFixations = pd.DataFrame({'tStart':[4,12],'tEnd':[8,14]})
我想检查 dfSamples 中的每个值是否在 dfFixations 中给定的任意两个范围内,然后为该值分配一个标签。我发现了这个:Check if value in a dataframe is between two values in another dataframe,但循环解决方案非常慢,我无法让任何其他解决方案工作。
工作(但非常慢)示例:
labels = np.empty_like(dfSamples['tSample']).astype(np.chararray)
for i, fixation in dfFix.iterrows():
log_range = dfSamples['tSample'].between(fixation['tStart'], fixation['tEnd'])
labels[log_range] = 'fixation'
labels[labels != 'fixation'] = 'no_fixation'
dfSamples['labels'] = labels
按照这个例子:Performance of Pandas apply vs np.vectorize to create new column from existing columns 我试图向量化它但没有成功。
def check_range(samples, tstart, tend):
log_range = (samples > tstart) & (samples < tend)
return log_range
fixations = list(map(check_range, dfSamples['tSample'], dfFix['tStart'], dfFix['tEnd']))
不胜感激!
【问题讨论】:
标签: python pandas dataframe vectorization