Python 根据条件将具有另一行值的列添加到dataframe

Python 根据条件将具有另一行值的列添加到dataframe,python,pandas,dataframe,lambda,Python,Pandas,Dataframe,Lambda,我有一个数据框,其中的列名为“id”、“x”、“y”和“time” 身份证件 时间 x Y 1. 0 14 12 1. 1. 32 23 1. 2. 52 14 2. 2. 12 34 3. 0 62 17 3. 1. 82 35 3. 2. 22 25 您可以通过使用t-2seconds处的值重新填充time列中的值来创建新的数据帧,然后left将该新数据帧与id,time列上的原始数据帧合并,以获得结果: df_r = df.assign(time=df['time'].sub(2)) df

我有一个数据框,其中的列名为“id”、“x”、“y”和“time”

身份证件 时间 x Y 1. 0 14 12 1. 1. 32 23 1. 2. 52 14 2. 2. 12 34 3. 0 62 17 3. 1. 82 35 3. 2. 22 25
您可以通过使用
t-2
seconds处的值重新填充
time
列中的值来创建新的数据帧,然后left
将该新数据帧与
id,time
列上的原始数据帧合并,以获得结果:

df_r = df.assign(time=df['time'].sub(2))
df.merge(df_r, on=['id', 'time'], how='left', suffixes=['', '2'])


每个id内的查找时间+2

id=[1,1,1,2,3,3,3]
time=[0,1,2,2,0,1,2]
x=[14,32,52,12,62,82,22]
y=[12,23,14,34,17,35,25]

df=pd.DataFrame({'id':id,'time':time,'x':x,'y':y})
df.reset_index()
df['x2']=0
df['y2']=0

for key,item in df.iterrows():

   lookup=(item['time']+2) 
   filter=(df['time']==lookup) & (df['id']==item['id'])
   results=df[filter]
   if len(results)>0:
       row=results.iloc[0]
       x2=row.x
       y2=row.y
       df.loc[key,['x2','y2']]=(x2,y2)


print(df) 

output:
   id  time   x   y  x2  y2
0   1     0  14  12  52  14
1   1     1  32  23   0   0
2   1     2  52  14   0   0
3   2     2  12  34   0   0
4   3     0  62  17  22  25
5   3     1  82  35   0   0
6   3     2  22  25   0   0

#no looping
df2=df.copy()
df2['time'] = df2.apply(lambda x: x['time']+2, axis=1)
results=df2[['id','time','x','y']].merge(df[['id','time','x','y']]
,on=['id','time'],how="left",suffixes=('', '2')).fillna(0)
print(results)

time
列中的所有值是否按照
id
顺序出现?time=0和time+2=2有三个结果:(52,14),(12,34),(22,55)time=2的第二次出现是如何选择(22,55)@ShubhamSharma不,它们不是。此外,并非所有ID都具有所有时间值。这需要通过以下方式来解决:condition@GoldenLion它们需要具有相同的id。何时选择12,34?向游戏玩家展示游戏规则谢谢。我只遇到了一个问题,因为实际的数据帧有其他列,所以在本例中,解决方案会提供额外的不需要的列。我只是把它们扔了。我不确定是否可以修改merge语句以选择要合并的特定列。不管怎样,放弃它们会产生预期的结果。我修复了一个错误,所以重新考虑你的投票。代码现在正在运行。我要求的是一个使用lambda的快捷方式解决方案,而不是循环。我在问题中提到,它对我来说使用循环有效,但不是使用快捷方式。您是否运行%%timeit以选择性能最佳的解决方案?我的解决方案可以改为调用函数的列表理解,但这是语法糖
id=[1,1,1,2,3,3,3]
time=[0,1,2,2,0,1,2]
x=[14,32,52,12,62,82,22]
y=[12,23,14,34,17,35,25]

df=pd.DataFrame({'id':id,'time':time,'x':x,'y':y})
df.reset_index()
df['x2']=0
df['y2']=0

for key,item in df.iterrows():

   lookup=(item['time']+2) 
   filter=(df['time']==lookup) & (df['id']==item['id'])
   results=df[filter]
   if len(results)>0:
       row=results.iloc[0]
       x2=row.x
       y2=row.y
       df.loc[key,['x2','y2']]=(x2,y2)


print(df) 

output:
   id  time   x   y  x2  y2
0   1     0  14  12  52  14
1   1     1  32  23   0   0
2   1     2  52  14   0   0
3   2     2  12  34   0   0
4   3     0  62  17  22  25
5   3     1  82  35   0   0
6   3     2  22  25   0   0

#no looping
df2=df.copy()
df2['time'] = df2.apply(lambda x: x['time']+2, axis=1)
results=df2[['id','time','x','y']].merge(df[['id','time','x','y']]
,on=['id','time'],how="left",suffixes=('', '2')).fillna(0)
print(results)