为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫列基于其他列中的值

熊猫列基于其他列中的值

MMTTMM 2021-05-13 17:10:49
基本上,我想在“ Discount_Sub_Dpt”列中填入“是”或“否”,具体取决于那一周该Sub_Dpt是否有折扣,但该行所登陆的产品除外(例如,我不需要任何逐行考虑A在该周是否有折扣,而仅对该子部门中的产品有折扣(在大多数情况下,还有其他多个产品)。我试过使用groupby和Sub_Dpt和Week无济于事。有谁知道如何解决这个问题?黄色列显然是代码的理想结果。这是我使用过的一些代码,我试图首先创建该列,然后更新值(但是可能都错了)(我还故意将其命名为数据帧df1):  df1['Discount_Sub_Dpt'] = np.where((df1['Discount']=='Yes'),'Yes','No') grps = []                     grps.append(df1.Sub_Dpt.unique()) for x in grps:      x = str(x)      yes_weeks = df1.loc[(df1.Discount_SubDpt == 'Yes') & (df1.Sub_Dpt_Description == x),'Week'].unique()          df1.loc[df1['Week'].isin(yes_weeks) & df1['Sub_Dpt_Description'] == x, 'Discount_SubDpt'] = 'Yes'
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

当Discount为“ Yes”时,您可以执行GroupBy映射('Week', 'Sub_Dpt')到的列表'Product'。


然后使用列表推导来检查是否有折扣产品存在问题。最后,将布尔序列结果映射到“是” /“否”。


来自@SahilPuri的数据。


# GroupBy only when Discount == Yes

g = df1[df1['Discount'] == 'Yes'].groupby(['Week', 'Sub_Dpt'])['Product'].unique()


# calculate index by row

idx = df1.set_index(['Week', 'Sub_Dpt']).index


# construct list of Booleans according to criteria

L = [any(x for x in g.get(i, []) if x!=j) for i, j in zip(idx, df1['Product'])]


# map Boolean to strings

df1['Discount_SubDpt'] = pd.Series(L).map({True: 'Yes', False: 'No'})


print(df1)


   Product  Week Sub_Dpt Discount Discount_SubDpt

0        A     1    Toys      Yes              No

1        A     2    Toys       No             Yes

2        A     3    Toys       No              No

3        A     4    Toys      Yes             Yes

4        B     1    Toys       No             Yes

5        B     2    Toys      Yes              No

6        B     3    Toys       No              No

7        B     4    Toys      Yes             Yes

8        C     1   Candy       No              No

9        C     2   Candy       No              No

10       C     3   Candy      Yes              No

11       C     4   Candy      Yes              No

12       D     1   Candy       No              No

13       D     2   Candy       No              No

14       D     3   Candy       No             Yes

15       D     4   Candy       No             Yes


查看完整回答
反对 回复 2021-05-18
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

好的,这可能无法很好地扩展,但应该易于阅读。


df1 = pd.DataFrame(data= [[ 'A',    1,  'Toys', 'Yes',  ],

[   'A',    2,  'Toys', 'No',   ],

[   'A',    3,  'Toys', 'No',   ],

[   'A',    4,  'Toys', 'Yes',  ],

[   'B',    1,  'Toys', 'No',   ],

[   'B',    2,  'Toys', 'Yes',  ],

[   'B',    3,  'Toys', 'No',   ],

[   'B',    4,  'Toys', 'Yes',  ],

[   'C',    1,  'Candy',    'No',   ],

[   'C',    2,  'Candy',    'No',   ],

[   'C',    3,  'Candy',    'Yes',  ],

[   'C',    4,  'Candy',    'Yes',  ],

[   'D',    1,  'Candy',    'No',   ],

[   'D',    2,  'Candy',    'No',   ],

[   'D',    3,  'Candy',    'No',   ],

[   'D',    4,  'Candy',    'No',   ],], columns=['Product', 'Week', 'Sub_Dpt',        'Discount'])

df2 = df1.set_index(['Product', 'Week', 'Sub_Dpt'])

products = df1.Product.unique()

df1['Discount_SubDpt'] = df1.apply(lambda x: 'Yes' if 'Yes' in df2.loc[(list(products[products != x['Product']]), x['Week'], x['Sub_Dpt']), 'Discount'].tolist() else 'No', axis=1)

第一步创建一个Multindex数据框。


接下来,我们获得所有产品的清单


接下来,对于每一行,我们取出同一周和子部门并删除产品。


在此列表中,如果有折扣,我们选择“是”,否则选择“否”


编辑1:


如果您不想创建另一个数据框(节省内存,但是会慢一些)


df1['Discount_SubDpt'] = df1.apply(lambda x: 'Yes' if 'Yes' in df1.loc[(df1['Product'] != x['Product']) & (df1['Week'] == x['Week']) & (df1['Sub_Dpt'] == x['Sub_Dpt']), 'Discount'].tolist() else 'No', axis=1)



查看完整回答
反对 回复 2021-05-18
  • 3 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号