按 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