python - 根据列值选择用户 - 熊猫数据框
问题描述
我在选择符合我的数据框中某些条件的 ID 时遇到问题。这是问题所在:我的数据框如下所示:
index ID score_1 score_2 ...
0 22 0 0
1 22 0 0
2 22 0 0
3 23 1 0
4 23 1 0
5 23 1 0
6 24 0 0
7 24 0 0
8 24 0 1
10 25 0 0
11 25 0 0
12 26 0 1
13 26 0 1
我想要做的是获取具有以下内容的 ID 数量:
score_1 == 0
对于所有情况-score_2 == 0
例如并满足此要求。ID == 22
ID == 25
score_1 == 0
, 但至少有一个给定的行ID
-score_2 == 1
例如ID == 24
满足此要求score_1 == 0
, 并且给定的所有行ID
都有score_2 == 1
- 例如ID == 26
满足这个要求
每个 ID 应仅出现在其中一个组中。
我尝试使用条件过滤和 groupby,但后来我得到重复的 ID,因为它只选择单行,而不是“记住”用户。我试过的一些代码:
# Create a df with only IDs that have score_1 == 0, group by `ID`
zero_IDs = df[df['score_1'] == 0].groupby(by = 'ID').nunique()
# 'Count' the number of IDs that have only one type of `score_2`
# But this does not differentitate between `0` or `1` values for score_2 column
zero_IDs[(zero_IDs['score_2'] == 1)].shape[0]
# 'Count' the number of IDs that have at leat one `score_2 == 1`
zero_IDs[(zero_IDs['score_2'] > 1)].shape[0]
你能帮我解决这个问题吗?
解决方案
这样的事情怎么样?结果是 [22 25] [24] [26]。
dfsum = df.groupby('ID').sum()
case1 = dfsum[(dfsum.score_1==0) & (dfsum.score_2==0)].index
case2 = dfsum[(dfsum.score_1==0) & (dfsum.score_2>0) & (dfsum.score_2<df.groupby('ID').count().score_2)].index
case3 = dfsum[(dfsum.score_1==0) & (dfsum.score_2>0) & (dfsum.score_2==df.groupby('ID').count().score_2)].index
print(case1.values)
print(case2.values)
print(case3.values)
推荐阅读
- java - 使用 Java 对 Object.String 进行排序
- glsl - 我应该在 glsl 中使用 vec3 还是 vec4 作为颜色类型?
- sql-server - ("IID_IColumnsInfo") CSV 文件的 SQL Server BULK INSERT 错误
- javascript - 无法在我的 html 中链接 javascript 文件
- python - 如何编写一个函数,仅计算类数组对象的前 n 项并返回它们的总和?
- r - RcppTN .cpp 脚本在来源时有效,但在库中编译时无效
- android - RecyclerView item element(imageview)click
- javascript - 如何在 swiper 滑块“.swiper-wrapper”类上添加固定的过渡持续时间值?
- rest - REST API 设计:当 api 必须返回一个字段的相等和不相等列表时,如何处理这种情况?
- c# - 尝试在锚标记助手中使用自定义路由时出错