Pandas 按列分组并检查多个条件以创建新的分类列

Posted

技术标签:

【中文标题】Pandas 按列分组并检查多个条件以创建新的分类列【英文标题】:Pandas groupby a column and check multiple conditions to create a new categorical column 【发布时间】:2021-12-22 00:54:12 【问题描述】:

与我的查询类似,我正在尝试按特定的允许分组代码进行分组,这次还要在设置类别之前检查其他多个条件。

例如,我有以下数据框:

MemberID AdmittingCode LOS Episode
1 a 5 3
2 a 10 6
1 b 2 3
2 b 1 6

现在,我想检查平均值是否是中位数的 2 倍以及最小集数是否小于 5,而不是简单地检查平均值和设置类别。我的意思是:

对于 AdmittingCode a,平均值为 7.5 ( (5 + 10) / 2 )。最初,逻辑是将 MemberID 1 的类别设置为 AdmittingCodea,0 因为它小于7.5 LOS(只有 5 个)和对于 MemberID 2 AdmittingCodea,1 因为它超过7.5 LOS(为 10)使用以下代码:

m = df.groupby('AdmittingCode')['LOS'].transform('mean').lt(df['LOS'])
df['LOSCategory'] = m.astype(int)

但是,现在我想在设置类别列之前再检查 2 个条件。

    我想检查平均值是否不是中位数的 2 倍 我还想检查一下情节计数是否小于 5

如果上述两个条件都满足,我希望将类别设置为 0 或 1(即使只有上述条件 1 满足但其他条件不满足的情况)。

注意:这里的平均值和中位数基于每个 AdmittingCode,因此 a 的平均值与 b 的平均值不同和上一个查询一样。

根据这个逻辑,对于 AdmittingCode a,平均值为 7.5,中位数也是 7.5,对于 MemberID 1 AdmittingCode a with LOS 5Episode 计数 3 ,类别将被设置为 0。这里,平均值不是中位数的 2 倍,而且计数小于 5。

最后观察到如下数据框:

MemberID AdmittingCode LOS Episode LOSCategory
1 a 5 3 0
2 a 10 6 1
1 b 2 3 0
2 b 1 6 1

【问题讨论】:

抱歉,您的情况不清楚:/ 嘿@mozway 所以基本上我想检查平均值是否是特定录取代码的中位数的 2 倍。例如,对于 AdmittingCode 'a',有 2 个成员,memberID 1 和 memberID 2。这里,LOS 分别是 5 和 10。因此,平均值为 5 + 10 / 2,即 7.5,中位数也是 5 + 10 /2,即 7.5。现在,对于 AdmittingCode 'a',平均值不是中位数的 2 倍。两者都等于 7.5。所以,它满足第一个条件。现在,对于 MemberID 1,Episode 计数为 3,小于 5,因此,当两个条件都满足时,LOSCategory 的标志设置为 0。 你有 2 个值,所以平均值总是等于中位数……?所以基本上你的代码似乎减少到“情节大于 5 吗?” 对于这个小例子是@mozway,但对于更大的数据框,我也需要检查这个东西。 我的建议,简化您的问题(删除文本,直奔主题),更新您的示例以提供涵盖不同场景的更有意义的内容 【参考方案1】:
>>> df['LOSCategory'] = (df.groupby("AdmittingCode")
             .apply(lambda x: x.apply(lambda xx:(x.LOS.mean() >= x.LOS.median()*2) | (xx.Episode >= 5), axis=1))
             .astype(int)
             .to_list()
                        )


>>> df

   MemberID  AdmittingCode  LOS  Episode  LOSCategory
0          1             a    5        3            0
1          2             a   10        6            1
2          1             b    2        3            0
3          2             b    1        6            1


【讨论】:

【参考方案2】:

您需要编写一个函数func 来返回所需的结果。

LOScategory = df.apply(
         lambda row: func(row['MemberID'], row['AdmittingCode'],row['LOS'],row['Episode']),
         axis=1)
df['LOScategory'] = LOScategory

【讨论】:

您能否详细说明该功能。函数应该是什么,它如何接受参数和操作? 取决于您的 LOCcategory 所依赖的内容。您需要对每一行进行计算并返回值。

以上是关于Pandas 按列分组并检查多个条件以创建新的分类列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:以列表形式按列分组的每个日期的频率

Pandas:有没有办法遍历数据框并使用多个条件创建新的数据框?

如何通过对多个变量进行分组来创建新的 pandas 数据框?

我可以在 OBIEE 分析报告中按列创建新的分组吗?

如何在 Pandas 数据框中按列值分组

如何在 Python 中使用 Pandas 按列分组