我有一个这样的数据框:
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
