Python Pandas:创建查找&;的新列;根据条件从另一行中选择值
我需要在Pandas中创建一个新列,从以前的数据中为特定ID查找特定星期中特定日期的值。数据如下所示:Python Pandas:创建查找&;的新列;根据条件从另一行中选择值,python,pandas,Python,Pandas,我需要在Pandas中创建一个新列,从以前的数据中为特定ID查找特定星期中特定日期的值。数据如下所示: ID / Day / Week / Value 1 / Mon / 5 / 10 1 / Tue / 5 / 12 1 / Wed / 5 / 17 2 / Mon / 5 / 12 2 / Tue / 5 / 14 2 / Wed / 5 / 12 3 / Mon / 5 / 16 3 / Tue / 5 / 19 3 / Wed / 5 / 22 1 / Mon / 6 / 12 1
ID / Day / Week / Value
1 / Mon / 5 / 10
1 / Tue / 5 / 12
1 / Wed / 5 / 17
2 / Mon / 5 / 12
2 / Tue / 5 / 14
2 / Wed / 5 / 12
3 / Mon / 5 / 16
3 / Tue / 5 / 19
3 / Wed / 5 / 22
1 / Mon / 6 / 12
1 / Tue / 6 / 17
1 / Wed / 6 / 16
2 / Mon / 6 / 15
2 / Tue / 6 / 15
2 / Wed / 6 / 20
3 / Mon / 6 / 10
3 / Tue / 6 / 14
3 / Wed / 6 / 17
1 / Mon / 7 / 12
1 / Tue / 7 / 19
1 / Wed / 7 / 22
2 / Mon / 7 / 13
2 / Tue / 7 / 14
2 / Wed / 7 / 25
3 / Mon / 7 / 11
3 / Tue / 7 / 16
3 / Wed / 7 / 20
df[(df.Day == df.Day) & (df.week == 5) & (df.ID == df.ID)]['Value'].values[0]
现在让我们假设我想创建一个名为“Wk5Val”的新列,该列始终查找并选择第5周中同一ID的同一天的值。例如,对于ID=2,day=Tue,Week=7,该值应该是14,因为这是ID=2&day=Tue的第5周值
在这一点上,我已经尝试了十几种不同的方法,但都无法解决这个问题。在我的脑海中,我认为它的工作原理相当于这样:
ID / Day / Week / Value
1 / Mon / 5 / 10
1 / Tue / 5 / 12
1 / Wed / 5 / 17
2 / Mon / 5 / 12
2 / Tue / 5 / 14
2 / Wed / 5 / 12
3 / Mon / 5 / 16
3 / Tue / 5 / 19
3 / Wed / 5 / 22
1 / Mon / 6 / 12
1 / Tue / 6 / 17
1 / Wed / 6 / 16
2 / Mon / 6 / 15
2 / Tue / 6 / 15
2 / Wed / 6 / 20
3 / Mon / 6 / 10
3 / Tue / 6 / 14
3 / Wed / 6 / 17
1 / Mon / 7 / 12
1 / Tue / 7 / 19
1 / Wed / 7 / 22
2 / Mon / 7 / 13
2 / Tue / 7 / 14
2 / Wed / 7 / 25
3 / Mon / 7 / 11
3 / Tue / 7 / 16
3 / Wed / 7 / 20
df[(df.Day == df.Day) & (df.week == 5) & (df.ID == df.ID)]['Value'].values[0]
但这只适用于特定值。我需要它来处理数据帧中的每一行,并根据“日”和“ID”进行调整
有什么直接的方法可以做到这一点吗?IIUC
您可以将布尔索引与merge
df.merge(df.loc[df['Week'] == 5, ['ID', 'Day', 'Value']],
on=['ID', 'Day'], suffixes=['', '_Week5'])
ID Day Week Value Value_Week5
0 1 Mon 5 10 10
1 1 Mon 6 12 10
2 1 Mon 7 12 10
3 1 Tue 5 12 12
4 1 Tue 6 17 12
5 1 Tue 7 19 12
6 1 Wed 5 17 17
7 1 Wed 6 16 17
8 1 Wed 7 22 17
9 2 Mon 5 12 12
10 2 Mon 6 15 12
11 2 Mon 7 13 12
12 2 Tue 5 14 14
13 2 Tue 6 15 14
14 2 Tue 7 14 14
15 2 Wed 5 12 12
16 2 Wed 6 20 12
17 2 Wed 7 25 12
18 3 Mon 5 16 16
19 3 Mon 6 10 16
20 3 Mon 7 11 16
21 3 Tue 5 19 19
22 3 Tue 6 14 19
23 3 Tue 7 16 19
24 3 Wed 5 22 22
25 3 Wed 6 17 22
26 3 Wed 7 20 22
IIUC
您可以将布尔索引与merge
df.merge(df.loc[df['Week'] == 5, ['ID', 'Day', 'Value']],
on=['ID', 'Day'], suffixes=['', '_Week5'])
ID Day Week Value Value_Week5
0 1 Mon 5 10 10
1 1 Mon 6 12 10
2 1 Mon 7 12 10
3 1 Tue 5 12 12
4 1 Tue 6 17 12
5 1 Tue 7 19 12
6 1 Wed 5 17 17
7 1 Wed 6 16 17
8 1 Wed 7 22 17
9 2 Mon 5 12 12
10 2 Mon 6 15 12
11 2 Mon 7 13 12
12 2 Tue 5 14 14
13 2 Tue 6 15 14
14 2 Tue 7 14 14
15 2 Wed 5 12 12
16 2 Wed 6 20 12
17 2 Wed 7 25 12
18 3 Mon 5 16 16
19 3 Mon 6 10 16
20 3 Mon 7 11 16
21 3 Tue 5 19 19
22 3 Tue 6 14 19
23 3 Tue 7 16 19
24 3 Wed 5 22 22
25 3 Wed 6 17 22
26 3 Wed 7 20 22
您能否按照中的说明添加创建数据的代码?我现在很忙,因此稍后将尝试发布正确的答案,抱歉,但这应该通过1)对数据进行排序并使用pd.Series.shift(-1)来解决或者2)将数据帧的副本合并到原始和交叉引用中您是否可以添加创建数据的代码,如中所述?我现在很忙,因此稍后将尝试发布正确答案,抱歉,但这应该通过1)对数据进行排序并使用pd.Series.shift(-1)来解决或者2)将数据帧的副本合并到原始数据帧上并交叉引用这是一个很好的答案,但我认为这是一个误导性的描述。您已经使用
.loc
函数将新的数据帧对象传递给合并函数调用。因此,布尔索引和合并函数是unrelated@RicardoUdenze我实际上是将一个布尔序列传递给.loc
,以过滤原始数据帧,然后将原始数据帧与过滤后的数据帧合并。这个描述有什么误导性?对我来说,它暗示了合并函数可以直接使用布尔索引。我只是觉得它可以解释得更好/代码可以更可读,但我只是在思考我的工作,我向新的程序员解释了很多东西。这是一个很好的答案,但我认为这是一个误导性的描述。您已经使用.loc
函数将新的数据帧对象传递给合并函数调用。因此,布尔索引和合并函数是unrelated@RicardoUdenze我实际上是将一个布尔序列传递给.loc
,以过滤原始数据帧,然后将原始数据帧与过滤后的数据帧合并。这个描述有什么误导性?对我来说,它暗示了合并函数可以直接使用布尔索引。我只是觉得可以更好地解释/代码可以更可读,但我只是在思考我的工作,在那里我向新的程序员解释了很多东西