根据一组列中的首选项和另一组列中的可用资源定义新列



我有一个包含许多列的数据帧,其中 7 列与此处相关。

df1=pd.DataFrame({'Shipment ID':[1,2,3,4,5,6],'Pref 1':['UPS','DHL','DHL','ARA','USPS','FED'],'Pref 2':['DHL','','FED','FED','UPS','USPS'],'Pref 3':['FED','','','DHL','ARA',''],'BudgetUPS':[NaN,'No','Yes',NaN,'No','Yes'],'BudgetUSPS':['Yes','Yes','Yes',NaN,'Yes','No'],'BudgetFED':['No','Yes',NaN,'Yes','Yes','No'],'BudgetARA':['Yes',NaN,NaN,NaN,NaN,'Yes'],'BudgetDHL':['No','Yes','Yes',NaN,'Yes','Yes']})

此处的数据代表了电子商务网站生成的每个货件的运输代理的前 3 个客户偏好。预算列指定相应发货代理的预算是可用、不可用还是未知(由于查询失败(。

我需要生成的是一列,该列选取每个货件 ID 的前两个(或一个,或没有(首选项,并为每个货件创建条目(列名称:Prefnbudget(,如"FED UPS"、"USPS"、"DHL ARA"、"NONE"。此步骤的目的是 a( 检测是否可以按照客户偏好处理货件,以及预算限制(以防止死锁(,b( 向客户查询确认。

我想让答案尽可能蟒蛇。在列表['DHL','UPS','USPS','ARA','FED']等循环中做到这一点当然很容易,但我想要一些更矢量化,更简洁紧凑的东西。

我复制了你的数据帧。以下是实现任务的一种方法:

# this dictionary maps column name to its index (column count) in the dataframe
dictIndexToCol = {col_name: i for i, col_name in enumerate(df1.columns)}
def getPref(row, dictIdxToCol=dictIndexToCol):
""" This function takes the preferences and checks whether Budget value is Yes """
pref1 = row[1]
pref2 = row[2]
pref3 = row[3]
pref_budget = " "
if len(pref1) > 0:
if row[dictIdxToCol[f"Budget{pref1}"]] == "Yes":
pref_budget += pref1 + " "
if len(pref2) > 0:            
if row[dictIdxToCol[f"Budget{pref2}"]] == "Yes":
pref_budget += pref2 + " "
if len(pref3) > 0:             
if row[dictIdxToCol[f"Budget{pref3}"]] == "Yes":
pref_budget += pref3
return pref_budget
df1["Prefnbudget"] = df1.apply(lambda row: getPref(row), axis=1)

最新更新