Pandas应用与定位效率与索引

2024-09-28 16:22:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到每行满足特定条件的第一个值。例如,我想找到当前行增加5%后的第一个rate/value(不一定是第一个之后)。添加的列将是最后一个“first5percentIncrease”,并且是第一行(在当前行之后)的索引(和/或值),该行的增长率为5%。请注意,每个索引都不能低于当前行的索引。在

          amount    date    rate    total   type first5percentIncreaseValue first5percentIncreaseIndex
9248    0.05745868  2018-01-22 06:11:36 10  0.00099984  buy 10.5 9341
9249    1.14869147  2018-01-22 06:08:38 20  0.01998989  buy 21 9421
9250    0.16498080  2018-01-22 06:02:59 15  0.00286241  sell 15.75 9266
9251    0.02881844  2018-01-22 06:01:54 2   0.00049999  sell 2.1 10911

我尝试使用loc()将其应用于每一行。对于大约9k行,输出至少需要10秒。这就完成了任务(我得到了一个比给定行高5%的所有值的列表),但是有没有更有效的方法来实现这一点?另外,我只想得到第一个值,但当我这样做时,我认为它是从第一行开始的。有没有办法从当前行开始.locs搜索,这样我就可以只取第一个值了?在

^{pr2}$

更进一步的澄清说它比我说得更好:

哦,我想我现在明白了!”对于每一行,向下扫描,得到你遇到的第一行显示至少增加了5%,“对吗?我将编辑我的答案:)——彼得·莱姆比格勒


Tags: dateratevaluetypebuyamountloctotal
2条回答

下面是一个特定示例的方法,该示例使用下一个可用行的索引标记每一行,该行的索引至少增加了5%。在

# Example data
df = pd.DataFrame({'rate': [100, 105, 99, 110, 130, 120, 98]})

# Series.shift(n) moves elements n places forward = down. We use
# it here in the denominator in order to compare each change with 
# the initial value, rather than the final value.

mask = df.rate.diff()/df.rate.shift() >= 0.05

df.loc[mask, 'next_big_change_idx'] = df[mask].index
df.next_big_change_idx = df.next_big_change_idx.bfill().shift(-1)

# output
df
   rate  next_big_change_idx
0   100                  1.0
1   105                  3.0
2    99                  3.0
3   110                  4.0
4   130                  NaN
5   120                  NaN
6    98                  NaN

下一个回答很快,彼得看了看。我想让它在每一排都这样。下面是我最后得到的结果-不是很快,但是它遍历每一行并返回满足我的条件的第一个值(或者在我的例子中,由于时间序列是递减的,所以最后一个值)满足我的条件(增加了5%)。在

def test_rows(x):
    return trade_history_df['rate'].loc[
        trade_history_df['rate'] >= x['rate'] + (x['rate'] * .05)].loc[
        trade_history_df['date'] > x['date']].last_valid_index()

test1 = trade_history_df[['rate','date']].apply(test_rows,axis = 1)

相关问题 更多 >