我有两个表,其中包含零售商用户在前期和后期使用的信息.我的目标是找出零售商在后期对用户来说是什么 fresh 事.我想知道如何在user_id窗口中做到这一点,因为is_in()loc[]解决方案不太适合我的任务.此外,我还在考虑过滤联接(特别是反联接),但效果并不好.以下是示例数据:

sample1 = pd.DataFrame(
    {
        'user_id': [45, 556, 556, 556, 556, 556, 556, 1344, 1588, 2063, 2063, 2063, 2673, 2982, 2982],
        'retailer': ['retailer_1', 'retailer_1', 'retailer_2', 'retailer_3', 'retailer_4', 'retailer_5', 'retailer_6', 
                     'retailer_3', 'retailer_2', 'retailer_2', 'retailer_3', 'retailer_7', 'retailer_1', 'retailer_1', 'retailer_2']
    }
)

sample2 = pd.DataFrame(
    {
        'user_id': [45, 45, 556, 556, 556, 556, 556, 556, 1344, 1588, 2063, 2063, 2063, 2673, 2673, 2982, 2982],
        'retailer': ['retailer_1', 'retailer_6', 'retailer_1', 'retailer_2', 'retailer_3', 'retailer_4', 'retailer_5', 'retailer_6', 
                     'retailer_3', 'retailer_2', 'retailer_2', 'retailer_3', 'retailer_7', 'retailer_1', 'retailer_2', 'retailer_1', 'retailer_2']
    }
) 

我想要的结果是这样的:

{'user_id': {0: 45, 1: 45, 2: 556, 3: 556, 4: 556, 5: 556, 6: 556, 7: 556, 8: 1344, 9: 1588, 10: 2063, 11: 2063, 12: 2063, 13: 2673, 14: 2673, 15: 2982, 16: 2982}, 'retailer': {0: 'retailer_1', 1: 'retailer_6', 2: 'retailer_1', 3: 'retailer_2', 4: 'retailer_3', 5: 'retailer_4', 6: 'retailer_5', 7: 'retailer_6', 8: 'retailer_3', 9: 'retailer_2', 10: 'retailer_2', 11: 'retailer_3', 12: 'retailer_7', 13: 'retailer_1', 14: 'retailer_2', 15: 'retailer_1', 16: 'retailer_2'}, 'is_new_retailer': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 1, 15: 0, 16: 0}}

推荐答案

一种 idea 是在Left Join中使用indicator参数,因此可以从左侧标识行,如果两个DataFrame中两个列都没有重复,则可以完美地工作.

out = sample2.merge(sample1, indicator='is_new_retailer', how='left')
out['is_new_retailer'] = out['is_new_retailer'].eq('left_only').astype(int)
print (out)
    user_id    retailer  is_new_retailer
0        45  retailer_1                0
1        45  retailer_6                1
2       556  retailer_1                0
3       556  retailer_2                0
4       556  retailer_3                0
5       556  retailer_4                0
6       556  retailer_5                0
7       556  retailer_6                0
8      1344  retailer_3                0
9      1588  retailer_2                0
10     2063  retailer_2                0
11     2063  retailer_3                0
12     2063  retailer_7                0
13     2673  retailer_1                0
14     2673  retailer_2                1
15     2982  retailer_1                0
16     2982  retailer_2                0

一般解决方案是测试MultiIndex × Index.isin:

mux1 = pd.MultiIndex.from_frame(sample2[['user_id','retailer']])
mux2 = pd.MultiIndex.from_frame(sample1[['user_id','retailer']])
sample2['is_new_retailer'] = (~mux1.isin(mux2).astype(int)
print (sample2)
    user_id    retailer  is_new_retailer
0        45  retailer_1                0
1        45  retailer_6                1
2       556  retailer_1                0
3       556  retailer_2                0
4       556  retailer_3                0
5       556  retailer_4                0
6       556  retailer_5                0
7       556  retailer_6                0
8      1344  retailer_3                0
9      1588  retailer_2                0
10     2063  retailer_2                0
11     2063  retailer_3                0
12     2063  retailer_7                0
13     2673  retailer_1                0
14     2673  retailer_2                1
15     2982  retailer_1                0
16     2982  retailer_2                0

Python相关问答推荐

从不规则形状区域返回使用openCV跟踪的对象的着陆位置

Django:如何将一个模型的唯一实例创建为另一个模型中的字段

使用子字符串动态更新Python DataFrame中的列

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

使用Python从HTTP打印值

为什么我的主页不会重定向到详细视图(Django)

如何在Power Query中按名称和时间总和进行分组

按 struct 值对Polars列表[struct[]]排序

替换字符串中的点/逗号,以便可以将其转换为浮动

"Discord机器人中缺少所需的位置参数ctx

数字梯度的意外值

Python中是否有方法从公共域检索搜索结果

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

try 与gemini-pro进行多轮聊天时出错

如何使用symy打印方程?

如何制作10,000年及以后的日期时间对象?

log 1 p numpy的意外行为

删除字符串中第一次出现单词后的所有内容

给定高度约束的旋转角解析求解

Django—cte给出:QuerySet对象没有属性with_cte''''