【问题标题】:group by ID, then check the last row in two specific columns if it's equal to value按 ID 分组,然后检查两个特定列中的最后一行是否等于值
【发布时间】:2022-06-17 06:09:06
【问题描述】:

所以我有这样的dataFrame:

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 列中的最后一行,如果它大于特定数字,假设 name ('r') 是group(1) 中 (name) 列的最后一行,它的最后一行 (age) 应该 >= 15,如果该年龄条件满足,则创建另一个列,表示整个组已满足或不满足。对于 [names] 和 [ages] 列中每个组的最后一行,同样的事情。

所以这些是其他字母(姓名)和他们的(年龄)条件:

在按[ID]分组的dataFrame中,如果最后一行(name)是(r)最后一行(age)应该>=15,如果最后一行(name)是(f)最后一行( age) 应该 >= 55, 如果最后一行 (name) 是 (o) 最后一行 (age) 应该 >= 182 , 如果最后一行 (name) 是 (k) 最后一行 (age) 应该是>= 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 如何做到这一点?

【问题讨论】:

  • 我不明白您的预期输出。每一行都应该是不满意的,因为分组 ID 为 1,2 和 3 不等于 kID 4 最后一行是 kage<=60
  • 所以基本上我需要一个代码来执行以下操作:groupby ID,然后对于按数据集分组,它将转到名称列让我们说组(1),它会检查它的最后一个在我们的例子中是 (r) 的行,所以因为它是 r,所以我需要另一个条件,即进入年龄列并检查 groupby (1) 中的最后一行,如果年龄 >= 15,那么我需要饱和词在新列中
  • 是的,这就是您在问题中已经解释的内容,但是您的预期输出是否错误?! ....或者每个 ID 的条件都会发生变化(在同一个 df 中)
  • 实际上变化取决于每个 groupby 中名称的最后一行以及年龄列的最后一行
  • 所以最后一行是 (r) 年龄应该 >= 15,如果最后一行是 (f) 年龄应该 >= 55,如果最后一行是 (o)年龄应该是 >= 182 ,如果最后一行是 (k) 年龄应该是 >= 50

标签: python pandas dataframe


【解决方案1】:

您可以尝试 group by 然后使用 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

【讨论】:

  • 效果很好!!非常感谢,这真的很有帮助:)。
猜你喜欢
  • 2012-07-02
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2019-12-28
  • 1970-01-01
  • 2021-12-08
  • 2021-04-06
相关资源
最近更新 更多