pandas-访问数据框中上一行的值

时间:2020-09-02 04:04:09

标签: python pandas dataframe

我试图将新列添加到我的数据框中,该列取决于先前行中可能存在或可能不存在的值。我的数据框如下所示:

index  id  timestamp  sequence_index value  prev_seq_index
0      10  1          0              5      0
1      10  1          1              1      2
2      10  1          2              2      0
3      10  2          0              9      0
4      10  2          1              10     1
5      10  2          2              3      1
6      11  2          0              42     1
7      11  2          1              13     0

注意indexsequence_index之间没有任何关系,index只是一个计数器。

我想要做的是添加一列prev_value,该列查找具有相同ID和sequence_index == prev_seq_index的最新行的值,如果不存在这样的前一行,请使用默认值这个问题的目的,我将使用默认值-1

index  id  timestamp  sequence_index value  prev_seq_index  prev_value
0      10  1          0              5      0               -1
1      10  1          1              1      2               -1
2      10  1          2              2      0               -1
3      10  2          0              9      0               5  # value from df[index == 0]
4      10  2          1              10     1               1  # value from df[index == 1]
5      10  2          2              3      1               1  # value from df[index == 1]
6      11  2          0              42     1               -1
7      11  2          1              13     0               -1

我当前的解决方案是蛮力的,它非常慢,我想知道是否有更快的方法:

prev_values = np.zeros(len(df))
i = 0
for index, row in df.iterrows():
    # filter for previous rows with the same id and desired sequence index
    tmp_df = df[(df.id == row.id) & (df.timestamp < row.timestamp) \
                 & (df.sequence_index == row.prev_seq_index)]
    if (len(tmp_df) > 0):
        # get value from the most recent row
        prev_value = tmp_df[tmp_df.index == tmp_df.timestamp.idxmax()].value
    else:
        prev_value = -1
    prev_values[i] = prev_value
    i += 1

df['prev_value'] = prev_values

1 个答案:

答案 0 :(得分:0)

我建议通过左联接解决此问题。但是首先,您需要确保您的数据没有重复项。您需要创建一个最新时间戳的数据框并获取值。

agg=pd.groupby(['sequence_index']).agg({'timestamp':'max'})

agg=pd.merge(agg,df['timestamp','sequence_index','value'], how='inner', on = ['timestamp','sequence_index'])

agg.rename(columns={'value': 'prev_value'}, inplace=True)

现在您可以将数据重新结合起来

df=pd.merge(df,agg,how='left',left_on='prev_seq_index',right_on='sequence_index')

现在您可以处理NaN值

df.prev_value=df.prev_value.fillna(-1)