![](/img/trans.png)
[英]Extract Value From Pandas Dataframe Based On Condition in Another Column
[英]pandas add column to dataframe having the value from another row based on condition
我有一個 dataframe 列名為“id”、“x”、“y”和“時間”
ID | 時間 | X | 是的 |
---|---|---|---|
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 |
我想在 dataframe 中添加兩列,以便它們具有來自具有相同 id 和時間 + 2 的另一行的 x 和 y 值
結果應該是這樣的:
ID | 時間 | X | 是的 | x2 | y2 |
---|---|---|---|---|---|
1 | 0 | 14 | 12 | 52 | 14 |
1 | 1 | 32 | 23 | ||
1 | 2 | 52 | 14 | ||
2 | 2 | 12 | 34 | ||
3 | 0 | 62 | 17 | 22 | 25 |
3 | 1 | 82 | 35 | ||
3 | 2 | 22 | 25 |
請注意 dataframe 不是按 id 排序的
我已經為 x2 嘗試了以下方法,但它沒有按預期工作:
t=2
data['x2'] = data.apply(lambda x: x['x'] if (data[(data['id']==x['id']) & ((data['time']+t) == x['time'])].size > 0) else '', axis=1)
以下工作,但我需要使用快捷方式和性能最好的方式,因為我的數據很大
t=2
for index, row in data.iterrows():
rowT = data[(data['id']==row['id']) & (data['time'] == (row['time'] + t))]
if rowT.size > 0:
data.loc[index,'x2'] = rowT['x'].values[0]
您可以通過使用t-2
秒的值重新填充time
列中的值來創建新的 dataframe,然后將這個新的 dataframe 與原始 Z6A8064B5DF4794555500553C47C50 時間列merge
id, time
以獲取結果
df_r = df.assign(time=df['time'].sub(2))
df.merge(df_r, on=['id', 'time'], how='left', suffixes=['', '2'])
id time x y x2 y2
0 1 0 14 12 52.0 14.0
1 1 1 32 23 NaN NaN
2 1 2 52 14 NaN NaN
3 2 2 12 34 NaN NaN
4 3 0 62 17 22.0 25.0
5 3 1 82 35 NaN NaN
6 3 2 22 25 NaN NaN
每個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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.