Python:筛选同时含Sell与Not Sell动作的公司分组报错解决
筛选同时包含两种动作的公司数据
原始DataFrame中,每家公司对应Sell、Not Sell两种动作之一,或同时存在两种动作。需求是保留同时具备两种动作的公司数据,删除仅有一种动作的公司数据。
尝试代码与报错
用户尝试通过分组筛选实现需求,代码如下:
sell=['Sell','Not Sell'] df['Action'].str.contains(sell).groupby([df['Date'],df['Company']]).transform('any')
运行后报错:'unhashable type: 'list''
问题原因
str.contains()方法仅支持传入字符串或正则表达式作为匹配规则,无法直接接收列表参数;且原代码的逻辑方向有误——我们需要检查的是分组后每组是否同时包含两种动作,而非每行是否匹配列表中的字符串。
解决方案
以下两种方法均可实现需求:
方法一:检查分组动作集合是否包含全部目标动作
# 定义需要同时存在的动作集合 required_actions = {'Sell', 'Not Sell'} # 按Date和Company分组,检查每组的动作集合是否包含所有目标动作 mask = df.groupby(['Date', 'Company'])['Action'].transform(lambda x: required_actions.issubset(x.unique())) # 筛选符合条件的数据行 filtered_df = df[mask]
方法二:统计分组内唯一动作的数量
# 按Date和Company分组,统计每组的唯一动作数量是否等于2 mask = df.groupby(['Date', 'Company'])['Action'].transform(lambda x: x.nunique() == 2) # 筛选符合条件的数据行 filtered_df = df[mask]
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

