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

问题描述 投票:0回答:1

我有一个包含很多列的数据框,其中有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']})

此处的数据代表电子商务网站生成的每批货物的货运代理商的前三名客户偏好。预算列指定相应货运代理的预算是否可用,不可用或未知(由于查询失败)。

[我需要生成的一列将为每个货件ID选取前两个(或一个,或不选择)首选项,并创建条目(列名:Prefnbudget),例如“ FED UPS”,“ USPS”,“ DHL ARA”,“无”。此步骤的目的是:a)检测是否可以按照客户喜好处理装运,并且预算约束(防止死锁),b)向客户查询确认信息。

我想尽可能用pythonic来回答。在列表['DHL','UPS','USPS','ARA','FED']等循环中进行此操作当然很容易,但是我想要更矢量化且紧凑的东西。

pandas dataframe
1个回答
0
投票

我复制了您的数据框。以下是执行任务的一种方法:

# 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)
© www.soinside.com 2019 - 2024. All rights reserved.