【发布时间】:2021-02-06 09:58:03
【问题描述】:
我有一个数据框,其中包含名为“id”、“x”、“y”和“时间”的列
| id | 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 |
我想向数据框添加两列,以便它们具有来自另一行的 x 和 y 的值,该行具有相同的 id 和时间 + 2
结果应该是这样的:
| id | time | x | y | 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]
【问题讨论】:
-
time列中的所有值是否按id顺序存在? -
time =0 and time+2=2 有三个结果:(52,14),(12,34),(22,55) time=2 第二次出现怎么选择( 22,55)
-
@ShubhamSharma 不,他们不是。此外,并非所有 id 都具有所有时间值。需要条件来解决
-
@GoldenLion 他们需要具有相同的 ID。
-
什么时候选择12,34?向游戏揭示规则
标签: python pandas dataframe lambda