我有以下** Dataframe 设置**:
dic = {'customer_id': [102, 102, 105, 105, 110, 110, 111],
'product':['skateboard', 'skateboard', 'skateboard', 'skateboard', 'shoes', 'skateboard', 'skateboard'],
'brand': ['Vans', 'Converse', 'Vans', 'Converse', 'Converse','Converse', 'Vans'],
'membership': ['member', 'not-member', 'not-member', 'not-member', 'member','not-member', 'not-member']}
df = pd.DataFrame(dic)
**要求:**如果客户是任何品牌的“成员”,我需要删除customer_id和产品粒度的成员资格为“非成员"的行。
例如,在上面的 Dataframe 中,我们删除了产品为“skateboard”的客户“102”,其中会员资格为“non-member”,因为他们已经是某个品牌(Vans)的会员。我们没有删除105,因为他们不是任何品牌的会员。我们没有删除110,因为产品不同。
因此,输出应如下所示:
**我的方法:**首先列出唯一的customer_id + product(例如:102_skateboard).然后循环遍历列表,然后过滤掉唯一客户-产品对的 Dataframe ,然后检查 Dataframe 是否包含成员,如果为真,则删除非成员行.这给了我预期的输出,但我想知道是否有更好的方法来做到这一点.
df['customer_product'] = df['customer_id'].astype(str) + '_' + df['product']
unique_customer_product = df['customer_product'].unique()
for pair in unique_customer_product:
filtered_df = df[df['customer_product'] == pair]
if 'member' in filtered_df['membership'].values:
df = df.drop(df[(df.customer_product == pair) & (df.membership == 'not-member')].index)
3条答案
按热度按时间0dxa2lsx1#
创建一个辅助布尔列
is_member
,这样就可以非常直接地表达条件。e3bfsja22#
下面是一种方法:
然后:
c0vxltue3#
产出
这里是创建'row'帮助器列的位置。行按列'customer_id'、'product'为grouped,行被传递到apply,apply调用my_func函数。函数中有一个检查:必须存在值“not-member”和“member”。如果是,请使用loc将“不是成员”设置为False。