我试图将新列添加到我的数据框中,该列取决于先前行中可能存在或可能不存在的值。我的数据框如下所示:
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
注意:index
和sequence_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
答案 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)