Pandas 在给定值列表的数据框列中找到最接近值的索引
Pandas find the index of the closest value in a data frame column given a list of values
所以我试图找到一种矢量化方法来执行此操作,假设我有一个数据框 DF1,其中包含一个时间戳列,其中有很多时间戳按递增顺序排列。我还有一个包含目标时间的列表,我想用它来查找 DF1 中包含最接近该目标时间的时间戳的行或该行的索引。我有一个使用 iterrows 的解决方案,但我想知道是否有一种方法可以不用 iterrows 来实现它,因为这可能需要很长时间。
数据框中的行数总是大于目标时间值列表。
如果目标时间介于两个时间戳之间,则始终选择最小的时间戳。
#Dataframe with timestamp
In [1]: df = pd.DataFrame([100, 150, 155, 180,185, 200], columns=['TimeStamp'])
#List of target times
targetTimes = [120, 130, 180, 187]
答案应该是:
#A list of indices
[0, 1, 3, 4]
#Or something like this
Out[1]:
TimeStamp
0 100
1 150
2 180
3 185
使用 merge_asof
将列表转换为一列 DataFrame
:
df1 = pd.DataFrame(targetTimes, columns=['new'])
df = pd.merge_asof(df1,
df,
left_on='new',
right_on='TimeStamp',
direction='nearest')
print (df)
new TimeStamp
0 120 100
1 130 150
2 180 180
3 187 185
所以我试图找到一种矢量化方法来执行此操作,假设我有一个数据框 DF1,其中包含一个时间戳列,其中有很多时间戳按递增顺序排列。我还有一个包含目标时间的列表,我想用它来查找 DF1 中包含最接近该目标时间的时间戳的行或该行的索引。我有一个使用 iterrows 的解决方案,但我想知道是否有一种方法可以不用 iterrows 来实现它,因为这可能需要很长时间。
数据框中的行数总是大于目标时间值列表。 如果目标时间介于两个时间戳之间,则始终选择最小的时间戳。
#Dataframe with timestamp
In [1]: df = pd.DataFrame([100, 150, 155, 180,185, 200], columns=['TimeStamp'])
#List of target times
targetTimes = [120, 130, 180, 187]
答案应该是:
#A list of indices
[0, 1, 3, 4]
#Or something like this
Out[1]:
TimeStamp
0 100
1 150
2 180
3 185
使用 merge_asof
将列表转换为一列 DataFrame
:
df1 = pd.DataFrame(targetTimes, columns=['new'])
df = pd.merge_asof(df1,
df,
left_on='new',
right_on='TimeStamp',
direction='nearest')
print (df)
new TimeStamp
0 120 100
1 130 150
2 180 180
3 187 185