繁体   English   中英

根据 python 中另一列中的 AND 条件获取一列中的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM