熊猫列基于其他列中的值

基本上,我想在“ Discount_Sub_Dpt”列中填入“是”或“否”,具体取决于那一周该Sub_Dpt是否有折扣,但该行所登陆的产品除外(例如,我不需要任何逐行考虑A在该周是否有折扣,而仅对该子部门中的产品有折扣(在大多数情况下,还有其他多个产品)。

我试过使用groupby和Sub_Dpt和Week无济于事。

有谁知道如何解决这个问题?

黄色列显然是代码的理想结果。

http://img3.mukewang.com/60a370510001241e03580272.jpg

这是我使用过的一些代码,我试图首先创建该列,然后更新值(但是可能都错了)(我还故意将其命名为数据帧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'



MMTTMM
浏览 134回答 3
3回答

牧羊人nacy

当Discount为“ Yes”时,您可以执行GroupBy映射('Week', 'Sub_Dpt')到的列表'Product'。然后使用列表推导来检查是否有折扣产品存在问题。最后,将布尔序列结果映射到“是” /“否”。来自@SahilPuri的数据。# GroupBy only when Discount == Yesg = df1[df1['Discount'] == 'Yes'].groupby(['Week', 'Sub_Dpt'])['Product'].unique()# calculate index by rowidx = df1.set_index(['Week', 'Sub_Dpt']).index# construct list of Booleans according to criteriaL = [any(x for x in g.get(i, []) if x!=j) for i, j in zip(idx, df1['Product'])]# map Boolean to stringsdf1['Discount_SubDpt'] = pd.Series(L).map({True: 'Yes', False: 'No'})print(df1)   Product  Week Sub_Dpt Discount Discount_SubDpt0        A     1    Toys      Yes              No1        A     2    Toys       No             Yes2        A     3    Toys       No              No3        A     4    Toys      Yes             Yes4        B     1    Toys       No             Yes5        B     2    Toys      Yes              No6        B     3    Toys       No              No7        B     4    Toys      Yes             Yes8        C     1   Candy       No              No9        C     2   Candy       No              No10       C     3   Candy      Yes              No11       C     4   Candy      Yes              No12       D     1   Candy       No              No13       D     2   Candy       No              No14       D     3   Candy       No             Yes15       D     4   Candy       No             Yes

红颜莎娜

好的,这可能无法很好地扩展,但应该易于阅读。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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python