Skip to main content
 首页 » 编程设计

python之获取不在某家商店购物的顾客列表

2025年05月04日9over140

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

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 

我想提取或标记未在麦当劳购物的汉堡王顾客。 (在这种情况下,肖恩康纳利和布拉德皮特)

我正在尝试在 shop == McDonalds 处创建一个掩码,并获取客户 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.where 标记它们:

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

我可以用一个函数来做到这一点,但希望以某种方式对其进行矢量化。完全失败,任何帮助表示赞赏。

请您参考如下方法:

这里有一个向量化的解决方案 loc和 isin . 首先我们获取 Burger King 的行,然后我们从 McDonalds

获取 Customers

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

bk = df.loc[df['shop'].eq('Burger King')] 
mc = df.loc[df['shop'].eq('McDonalds'), 'Customer'] 
 
bk[~bk['Customer'].isin(mc)] 
 
          shop      Customer  Customer ID  Amount 
7  Burger King  Sean Connery            5      84 
8  Burger King     Brad Pitt            6      52