按 ID 分组,然后检查两个特定列的最后一行是否等于值
group by ID, then check the last row in two specific columns if it's equal to value
所以我有这样的数据框:
ID
Age
name
1
12
m
1
13
n
1
14
r
1
15
r
2
11
l
2
22
f
2
33
f
2
55
f
3
150
o
3
160
j
3
170
s
3
180
o
4
10
k
4
20
k
4
30
k
4
40
k
我想先按 ID 分组,然后检查按 dataFrame 分组的 (name) 列的最后一行,如果最后一行相等,假设 'r' 比如我们例子中的 group (1) ,然后去检查 group(1) 的 age 列中的最后一行,如果它大于特定数字,比如说该名称 ('r') 是 group(1) 中 (name) 列的最后一行,它的最后一行 (age) 应该 >= 15,如果满足此年龄条件,则创建另一个列说整个小组满意或不满意。对于 [names] 和 [ages] 列中每个组的最后一行再次进行同样的操作。
所以这些是其他字母(姓名)和他们的(年龄)条件:
按[ID]数据帧分组,如果最后一行(名字)是(r)最后一行(年龄)应该>=15,如果最后一行(名字)是(f)最后row (age) should be >= 55, if the last row (name) is (o) the last row (age) should be >= 182 ,if the last row (name) is (k) 最后一行(年龄)应该 >= 50.
这是我要找的最后一个输出:
ID
Age
name
check_condition
1
12
m
satisfied
1
13
n
satisfied
1
14
r
satisfied
1
15
r
satisfied
2
11
l
satisfied
2
22
f
satisfied
2
33
f
satisfied
2
55
f
satisfied
3
150
o
unsatisfied
3
160
j
unsatisfied
3
170
s
unsatisfied
3
180
o
unsatisfied
4
10
k
unsatisfied
4
20
k
unsatisfied
4
30
k
unsatisfied
4
40
k
unsatisfied
我如何通过 pandas python 做到这一点?
您可以尝试分组,然后使用 group.iloc[-1][col]
获取每组的最后一行值
d = {'r': 15, 'f': 55, 'o': 182, 'k': 50}
df['check_condition'] = df['ID'].map(
df.groupby('ID').apply(lambda group:
'satisfied' if group.iloc[-1]['Age'] >= d.get(group.iloc[-1]['name'])
else 'unsatisfied')
)
ID Age name check_condition
0 1 12 m satisfied
1 1 13 n satisfied
2 1 14 r satisfied
3 1 15 r satisfied
4 2 11 l satisfied
5 2 22 f satisfied
6 2 33 f satisfied
7 2 55 f satisfied
8 3 150 o unsatisfied
9 3 160 j unsatisfied
10 3 170 s unsatisfied
11 3 180 o unsatisfied
12 4 10 k unsatisfied
13 4 20 k unsatisfied
14 4 30 k unsatisfied
15 4 40 k unsatisfied
所以我有这样的数据框:
ID | Age | name |
---|---|---|
1 | 12 | m |
1 | 13 | n |
1 | 14 | r |
1 | 15 | r |
2 | 11 | l |
2 | 22 | f |
2 | 33 | f |
2 | 55 | f |
3 | 150 | o |
3 | 160 | j |
3 | 170 | s |
3 | 180 | o |
4 | 10 | k |
4 | 20 | k |
4 | 30 | k |
4 | 40 | k |
我想先按 ID 分组,然后检查按 dataFrame 分组的 (name) 列的最后一行,如果最后一行相等,假设 'r' 比如我们例子中的 group (1) ,然后去检查 group(1) 的 age 列中的最后一行,如果它大于特定数字,比如说该名称 ('r') 是 group(1) 中 (name) 列的最后一行,它的最后一行 (age) 应该 >= 15,如果满足此年龄条件,则创建另一个列说整个小组满意或不满意。对于 [names] 和 [ages] 列中每个组的最后一行再次进行同样的操作。
所以这些是其他字母(姓名)和他们的(年龄)条件:
按[ID]数据帧分组,如果最后一行(名字)是(r)最后一行(年龄)应该>=15,如果最后一行(名字)是(f)最后row (age) should be >= 55, if the last row (name) is (o) the last row (age) should be >= 182 ,if the last row (name) is (k) 最后一行(年龄)应该 >= 50.
这是我要找的最后一个输出:
ID | Age | name | check_condition |
---|---|---|---|
1 | 12 | m | satisfied |
1 | 13 | n | satisfied |
1 | 14 | r | satisfied |
1 | 15 | r | satisfied |
2 | 11 | l | satisfied |
2 | 22 | f | satisfied |
2 | 33 | f | satisfied |
2 | 55 | f | satisfied |
3 | 150 | o | unsatisfied |
3 | 160 | j | unsatisfied |
3 | 170 | s | unsatisfied |
3 | 180 | o | unsatisfied |
4 | 10 | k | unsatisfied |
4 | 20 | k | unsatisfied |
4 | 30 | k | unsatisfied |
4 | 40 | k | unsatisfied |
我如何通过 pandas python 做到这一点?
您可以尝试分组,然后使用 group.iloc[-1][col]
d = {'r': 15, 'f': 55, 'o': 182, 'k': 50}
df['check_condition'] = df['ID'].map(
df.groupby('ID').apply(lambda group:
'satisfied' if group.iloc[-1]['Age'] >= d.get(group.iloc[-1]['name'])
else 'unsatisfied')
)
ID Age name check_condition
0 1 12 m satisfied
1 1 13 n satisfied
2 1 14 r satisfied
3 1 15 r satisfied
4 2 11 l satisfied
5 2 22 f satisfied
6 2 33 f satisfied
7 2 55 f satisfied
8 3 150 o unsatisfied
9 3 160 j unsatisfied
10 3 170 s unsatisfied
11 3 180 o unsatisfied
12 4 10 k unsatisfied
13 4 20 k unsatisfied
14 4 30 k unsatisfied
15 4 40 k unsatisfied