[英]Get values in one column based on an AND condition in another column in python
我在 python 中有以下 dataframe,列名称为“Order_number”和“item_id”,代表订单号和该订单中包含的项目。 我需要获取由 item_ids A 和 B 组成的订单号,所以我的结果应该是订单号 12345 和 84573
订单号 | item_id |
---|---|
12345 | 一种 |
12345 | 乙 |
34235 | 乙 |
43543 | 乙 |
84573 | 一种 |
84573 | 乙 |
45846 | 一种 |
我有以下代码,但出现错误:
df[df['item_id'] == 'A' & df['item_id'] == 'B']
TypeError: Cannot perform 'rand_' with a dtyped [object] array and scalar of type [bool]
您可以groupby.apply
lambda 检查每个“Order_number”的唯一“item_id”是否同时包含“A”和“B”; 然后过滤那些做的:
out = df.groupby('Order_number')['item_id'].apply(lambda x: {'A','B'}.issubset(x.unique().tolist())).pipe(lambda x: x.index[x]).tolist()
另一种选择是使用groupby.any
两次; 一次为“A”,一次为“B”创建 boolean 系列对象,如果Order_number
存在item_id
,则返回 True ; 然后因为我们希望两者都存在,所以我们使用&
并过滤“Order_number”:
out = (df['item_id'].eq('A').groupby(df['Order_number']).any() & df['item_id'].eq('B').groupby(df['Order_number']).any()).pipe(lambda x: x.index[x].tolist())
Output:
[12345, 84573]
我会按如下方式解决:按order number
分组并创建一个集合。 过滤器设置等于我们想要的。
(
df
.groupby("Order_number")
.agg(set)
.loc[lambda d: d['item_id'].eq({'A','B'})]
.index
.values
)
# results
# array([12345, 84573])
如果它是我们想要的子集,假设可以有不止 A 和 B,将过滤器.loc
更改为:
…
.loc[lambda d:d['item_id'].map({'A','B'}.issubset)]
…
# results
# array([12345, 84573])
哦,如果你想要一个列表而不是数组,请将 .values 更改为.values
tolist()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.