Python 获取不在特定商店购物的客户列表

Python 获取不在特定商店购物的客户列表,python,pandas,Python,Pandas,假设我有一个交易和客户的数据框架: df = pd.DataFrame({'shop': pd.Series(['McDonalds', 'McDonalds', 'McDonalds', 'McDonalds', 'Burger King', 'Burger King', 'Burger King', 'Burger King', 'Burger King', 'Trump Golf Course', 'Trump Golf Course', 'Trump Golf Course', 'Tru

假设我有一个交易和客户的数据框架:

df = pd.DataFrame({'shop': pd.Series(['McDonalds', 'McDonalds', 'McDonalds', 'McDonalds', 'Burger King', 'Burger King', 'Burger King', 'Burger King', 'Burger King', 'Trump Golf Course', 'Trump Golf Course', 'Trump Golf Course', 'Trump Golf Course', 'Trump Golf Course', 'Trump Golf Course'],dtype='object',index=pd.RangeIndex(start=0, stop=15, step=1)), 'Customer': pd.Series(['John Ryan', 'Jim Bob', 'Mary Ryan', 'Michael Patric', 'John Ryan', 'Jim Bob', 'Mary Ryan', 'Sean Connery', 'Brad Pitt', 'John Ryan', 'John Ryan', 'Michael Patric', 'Mary Ryan', 'John Ryan', 'Jim Bob'],dtype='object',index=pd.RangeIndex(start=0, stop=15, step=1)), 'Customer ID': pd.Series([1, 2, 3, 4, 1, 2, 3, 5, 6, 1, 1, 4, 3, 1, 2],dtype='int64',index=pd.RangeIndex(start=0, stop=15, step=1)), 'Amount': pd.Series([50, 32, 15, 65, 32, 51, 54, 84, 52, 51, 2, 32, 54, 87, 65],dtype='int64',index=pd.RangeIndex(start=0, stop=15, step=1))}, index=pd.RangeIndex(start=0, stop=15, step=1))

print(df)

                 shop        Customer  Customer ID  Amount
0           McDonalds       John Ryan            1      50
1           McDonalds         Jim Bob            2      32
2           McDonalds       Mary Ryan            3      15
3           McDonalds  Michael Patric            4      65
4         Burger King       John Ryan            1      32
5         Burger King         Jim Bob            2      51
6         Burger King       Mary Ryan            3      54
7         Burger King    Sean Connery            5      84
8         Burger King       Brad Pitt            6      52
9   Trump Golf Course       John Ryan            1      51
10  Trump Golf Course       John Ryan            1       2
11  Trump Golf Course  Michael Patric            4      32
12  Trump Golf Course       Mary Ryan            3      54
13  Trump Golf Course       John Ryan            1      87
14  Trump Golf Course         Jim Bob            2      65
我想提取或标记那些没有在麦当劳购物的汉堡王顾客。在这种情况下,肖恩·康纳利和布拉德·皮特

我正在尝试创建一个面具,其中商店==麦当劳,并获取客户ID

mask1 = df.shop == 'McDonalds'

mcdonalds_customer_ids = df[mask1]['Customer ID'].values

array([1, 2, 3, 4], dtype=int64)
然后创建一个单独的掩码,其中shop=='Burger King',客户ID不在麦当劳客户ID列表中:

mask = (df['shop'] == 'Burger King' & df['Customer ID'] not in mcdonalds_customer_ids)
我得到以下错误:

TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

TypeError: cannot compare a dtyped [int64] array with a scalar of type [bool]
我也尝试过使用np.where,但它变得更加混乱

我的预期产出只是提取两位没有在麦当劳购物的汉堡王顾客:

                 shop        Customer  Customer ID  Amount
7         Burger King    Sean Connery            5      84
8         Burger King       Brad Pitt            6      52
或者使用np标记它们,其中:

                 shop        Customer  Customer ID  Amount  No_McDonalds
7         Burger King    Sean Connery            5      84  True
8         Burger King       Brad Pitt            6      52  True
我可以用一个函数来实现这一点,但我希望以某种方式将其矢量化。完全失败,感谢您的帮助

这应该可以:

aux = df.groupby('Customer').shop.sum()

df['No_McDonalds'] = df.Customer.map(aux.apply(lambda x: ('Burger King' in x) & ('McDonalds' not in x)))
输出: 如果您需要解释,请告诉我,我会帮助您。

这应该可以:

aux = df.groupby('Customer').shop.sum()

df['No_McDonalds'] = df.Customer.map(aux.apply(lambda x: ('Burger King' in x) & ('McDonalds' not in x)))
输出: 如果您需要一些解释,请让我知道,我会帮助您。

groupby transform、unique和list comprehension的混合

m = ['McDonalds' not in x for x in  df.groupby('Customer').shop.transform('unique')]

df[m]

Out[494]:
          shop      Customer  Customer ID  Amount
7  Burger King  Sean Connery  5            84
8  Burger King  Brad Pitt     6            52
groupby转换、唯一和列表理解的混合

m = ['McDonalds' not in x for x in  df.groupby('Customer').shop.transform('unique')]

df[m]

Out[494]:
          shop      Customer  Customer ID  Amount
7  Burger King  Sean Connery  5            84
8  Burger King  Brad Pitt     6            52
在您的情况下,我想提取或标记没有在麦当劳购物的汉堡王顾客,您只需执行以下操作:

s = (set(df.loc[df.shop.eq('Burger King'), 'Customer ID']) 
    - set(df.loc[df.shop.eq('McDonalds'), 'Customer ID'])
    )
输出s:

要使用Buger King提取这些客户记录:

输出:

          shop      Customer  Customer ID  Amount
7  Burger King  Sean Connery            5      84
8  Burger King     Brad Pitt            6      52
在您的情况下,我想提取或标记没有在麦当劳购物的汉堡王顾客,您只需执行以下操作:

s = (set(df.loc[df.shop.eq('Burger King'), 'Customer ID']) 
    - set(df.loc[df.shop.eq('McDonalds'), 'Customer ID'])
    )
输出s:

要使用Buger King提取这些客户记录:

输出:

          shop      Customer  Customer ID  Amount
7  Burger King  Sean Connery            5      84
8  Burger King     Brad Pitt            6      52

这是一个带有和的矢量化解决方案。 首先我们得到了一排汉堡王,然后我们得到了来自麦当劳的顾客

最后检查汉堡王的哪位顾客没有去过麦当劳:

                 shop        Customer  Customer ID  Amount
7         Burger King    Sean Connery            5      84
8         Burger King       Brad Pitt            6      52

这是一个带有和的矢量化解决方案。 首先我们得到了一排汉堡王,然后我们得到了来自麦当劳的顾客

最后检查汉堡王的哪位顾客没有去过麦当劳:

                 shop        Customer  Customer ID  Amount
7         Burger King    Sean Connery            5      84
8         Burger King       Brad Pitt            6      52
结果:

          shop      Customer  Customer ID  Amount
7  Burger King  Sean Connery            5      84
8  Burger King     Brad Pitt            6      52
结果:

          shop      Customer  Customer ID  Amount
7  Burger King  Sean Connery            5      84
8  Burger King     Brad Pitt            6      52

您可以像这样使用groupby来完成

结果=df.groupbyCustomer\ .applylambda g:g.assignNo_麦当劳=g[商店]=麦当劳\ .reset_indexdrop=True
您可以像这样使用groupby来完成

结果=df.groupbyCustomer\ .applylambda g:g.assignNo_麦当劳=g[商店]=麦当劳\ .reset_indexdrop=True
基本上与我的逻辑相同,但更干净!.eq与==相同吗?我以前从未使用过它。是的,它的功能是,另外你可以指定一些额外的参数,比如fill_value,而且我发现它在我的代码中更干净,但这是首选项。请看@Scool,它的逻辑与我的基本相同,但更清晰!.eq与==相同吗?我以前从未使用过它。是的,它的功能是,另外你可以指定一些额外的参数,比如fill_value,而且我发现它在我的代码中更干净,但这是首选项。见@SCool