如何使用 pandas groupby.filter 保留至少一个值小于 24 的组
How to keep groups with at least one value less than 24 using pandas groupby.filter
我有一个看起来像这样的数据框:
CCode CId State Age
326112 1217012 Nebraska 20
326112 1217012 Nebraska 75
326112 1217012 Nebraska 107
320113 1317012 Alabama 37
320113 1317012 Alabama 38
320113 1317012 Alabama 39
320180 8017061 Arkansas 37
320180 8017061 Arkansas 38
320180 8017061 Arkansas 39
326112 1217011 California 36
326112 1217011 California 37
326112 1217011 California 38
我试图保留至少有一个年龄在 24 岁以下的组,并对过滤后的组重新分组。
我尝试按 4 列分组并使用链式 lambda 进行过滤:
df.groupby(['State', 'CId', 'CCode', 'Age']).filter(lambda x:x['Age'].sum()<23).groupby(['State', 'CId', 'CCode', 'Age']).std()
这会失去该组的其余成员:
CCode CId State Age
326112 1217012 Nebraska 20
需要输出:
CCode CId State Age
326112 1217012 Nebraska 20
326112 1217012 Nebraska 75
326112 1217012 Nebraska 107
基于:
what I would like to do is keep the groups that have an age starting below 24
df.groupby(['State', 'CId', 'CCode']).filter(lambda g: g.Age.lt(24).any())
# CCode CId State Age
# 0 326112 1217012 Nebraska 20
# 1 326112 1217012 Nebraska 75
# 2 326112 1217012 Nebraska 107
如果您必须仅根据 起始年龄 进行严格过滤,一种方法是使用 iloc
:
df.groupby(["State", "CId", "CCode"]).filter(lambda x: x["Age"].iloc[0] < 24)
输出:
CCode CId State Age
0 326112 1217012 Nebraska 20
1 326112 1217012 Nebraska 75
2 326112 1217012 Nebraska 107
我有一个看起来像这样的数据框:
CCode CId State Age
326112 1217012 Nebraska 20
326112 1217012 Nebraska 75
326112 1217012 Nebraska 107
320113 1317012 Alabama 37
320113 1317012 Alabama 38
320113 1317012 Alabama 39
320180 8017061 Arkansas 37
320180 8017061 Arkansas 38
320180 8017061 Arkansas 39
326112 1217011 California 36
326112 1217011 California 37
326112 1217011 California 38
我试图保留至少有一个年龄在 24 岁以下的组,并对过滤后的组重新分组。
我尝试按 4 列分组并使用链式 lambda 进行过滤:
df.groupby(['State', 'CId', 'CCode', 'Age']).filter(lambda x:x['Age'].sum()<23).groupby(['State', 'CId', 'CCode', 'Age']).std()
这会失去该组的其余成员:
CCode CId State Age
326112 1217012 Nebraska 20
需要输出:
CCode CId State Age
326112 1217012 Nebraska 20
326112 1217012 Nebraska 75
326112 1217012 Nebraska 107
基于
what I would like to do is keep the groups that have an age starting below 24
df.groupby(['State', 'CId', 'CCode']).filter(lambda g: g.Age.lt(24).any())
# CCode CId State Age
# 0 326112 1217012 Nebraska 20
# 1 326112 1217012 Nebraska 75
# 2 326112 1217012 Nebraska 107
如果您必须仅根据 起始年龄 进行严格过滤,一种方法是使用 iloc
:
df.groupby(["State", "CId", "CCode"]).filter(lambda x: x["Age"].iloc[0] < 24)
输出:
CCode CId State Age
0 326112 1217012 Nebraska 20
1 326112 1217012 Nebraska 75
2 326112 1217012 Nebraska 107