Skip to main content
 首页 » 编程设计

python之检查列中包含列表 pandas 数据框中的项目数

2025年05月04日15qq号

我有一个这样的数据框:

 index   customerID    item_tag   orderID    Amount 
   0         23            A         1        34.50 
   1         55            B         2        11.22 
   2         23            A         3         9.34 
   3         55            D         4       123.44 
   4         55            F         5       231.40 

我还有一个包含 item_tags 的列表,如下所示:

my_list = ['A', 'B', 'D'] 

现在我想检查每个客户从 my_list 中订购了多少商品类型。 例如,对于客户 23,此数字将 = 1,因为客户 23 只订购标记为 A 的商品,而不是 B 或 D。 然而,客户 55 订购了商品 B 和 D,因此该指示变量将为 2,因为 my_list 中的两种商品类型出现在他的订单中。 (他还订购了商品 F,但该商品不在 my_list 中)。

到目前为止,我尝试了 groupby([customerId, item_tag], as_index = False).count(),但这需要创建新的数据框(也许不一定?),然后对每个数据框使用 if 语句列表中的元素,但我怀疑有更优雅的方法。我找不到任何东西,无论是在谷歌还是在这里。 我的数据框有数百万行,所以我正在寻找最有效的解决方案。

因此,我想要这样的数据框:

 index   customerID   if_A  if_B  if_D  sum_in_list 
   0         23         1     0    0        1 
   1         55         0     1    1        2 

请您参考如下方法:

这是使用 get_dummies + groupby 的一种方法,您可以免费获得计数:

res = pd.get_dummies(df[['customerID', 'item_tag']], columns=['item_tag'])\ 
        .groupby(['customerID'], as_index=False).sum() 
 
print(res) 
 
   customerID  item_tag_A  item_tag_B  item_tag_D  item_tag_F 
0          23           2           0           0           0 
1          55           0           1           1           1 

如果您想要二进制结果并限制为特定标签,还有几个额外的步骤:

L = ['A', 'B', 'D'] 
 
df_filtered = df.loc[df['item_tag'].isin(L), ['customerID', 'item_tag']]  
 
res = pd.get_dummies(df_filtered, columns=['item_tag'])\ 
        .groupby(['customerID']).any().astype(int).reset_index() 
 
res['total_count'] = res.iloc[:, 1:].sum(axis=1) 
 
print(res) 
 
   customerID  item_tag_A  item_tag_B  item_tag_D  total_count 
0          23           1           0           0            1 
1          55           0           1           1            2