首页 > 解决方案 > Pandas Column 基于其他列中的值

问题描述

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

我曾尝试将 groupby 与 Sub_Dpt 和 Week 一起使用,但无济于事。

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

黄色列显然是代码的预期结果。

CSV 示例

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

标签: pythonpandascsvdataframepandas-groupby

解决方案


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

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)

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

接下来,我们得到所有产品的列表

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

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

编辑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)

推荐阅读