在下面的例子中,我希望返回相对于当前行的最后一个索引,其中“lower”是>=“upper”列。我能够像预期的那样使用结果做到这一点,但它不是真正的矢量化,并且对于较大的多帧来说效率很低。
import pandas as pd
# Sample DataFrame
data = {'lower': [7, 1, 6, 1, 1, 1, 1, 11, 1, 1],
'upper': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]}
df = pd.DataFrame(data=data)
df['DATE'] = pd.date_range('2020-01-01', periods=len(data['lower']))
df['DATE'] = pd.to_datetime(df['DATE'])
df.set_index('DATE', inplace=True)
# new columns that contains the most recent index of previous rows, where the previous "lower" is greater than or equal to the current "upper"
def get_most_recent_index(row):
previous_indices = df.loc[:row.name - pd.Timedelta(minutes=1)]
recent_index = previous_indices[previous_indices['lower'] >= row['upper']].index.max()
return recent_index
df['prev'] = df.apply(get_most_recent_index, axis=1)
print(df)
字符串
我该如何重写才能最有效?
4条答案
按热度按时间zaqlnxep1#
我不确定这是否可以向量化(因为你有依赖于过去状态的变量)。但是你可以尝试使用二进制搜索来加速计算,例如:
字符串
印刷品:
型
nbysray52#
还有一个结果略有不同的替代答案。
字符串
我不知道为什么我们在中间的两个日期得到
NaT
。我的解决方案在这些地方没有NaT
。x6yk4ghg3#
在我的理解中,循环遍历python对象,如列表和字典,而不是pandas数组行(可能是错误的)更快。因此,下面是我尝试过的,它适用于你的输入df:
字符串
jslywgbw4#
您可以使用范围连接来有效地获取匹配-来自pyjanitor的conditional_join解决了这个问题。如果可以,请分享您的性能测试。
字符串