如何根据条件将数据添加到数据框?

时间:2019-09-11 20:02:18

标签: python pandas dataframe

我有一个数据框,其中包含特定公司的员工数据。数据框具有五列(EMP_ID,COUNTRY,FUNCTIONAL_AREA,SPECIALTY,GENDER)。

我还有一个csv,它定义了整个数据集的子组。一个例子是:

  • GROUP_1:COUNTRY =加拿大和FUNCTIONAL_AREA = PRD
  • GROUP_2:COUNTRY =法国
  • GROUP_3:COUNTRY =法国和FUNCTIONAL_AREA = FS
  • GROUP_4:COUNTRY = FRANCE&FUNCTIONAL_AREA = FS&GENDER = Female

等等,依此类推。如您所见,每个员工都可以属于多个子组,并且大多数时候都可以。我需要做的是获取这些已定义的子组,并将该数据添加到原始数据框中。

我能够创建一个在Jupyter Notebook中工作的解决方案,但是现在我正在将该代码转换为python脚本,并且还在寻找一种更优雅的方法。

我最初的方法是定义一个函数,该函数包含将子组分配给特定记录(行)的逻辑。我在下面的函数中包含了一段代码。

然后,我将使用df.apply方法将该函数应用于数据帧中的每一行。对于每一行,该函数都会创建一个列表以保存其所属的所有子组,检查记录所属的子组并将该子组附加到列表中。 df.apply方法随后将该列表添加到名为GROUPS的新列中的记录中。

结果是带有新列(GROUPS)的原始数据框,其中包含每条记录的列表,并在该列表中显示了记录所属的子组。

然后,我使用MultiLabelBinarizer对该数据帧进行一次热编码,并将该数据帧转换为每个子组都有一个列,其中每个列包含每个记录的二进制值。

def assign_groups(row):
    # Define a group list that will contain the groups each record belongs to 
    group_list = []     

    if row.COUNTRY == 'Canada':
        if row.FUNCTIONAL_AREA == 'PRD':
            group_list.append(1)

    if row.COUNTRY == 'France':
        if row.FUNCTIONAL_AREA == 'FS':
            if row.GENDER == 'Female':
                group_list.append(4)
            group_list.append(3)
        group_list.append(2)
df['GROUPS'] = df.apply(assign_groups, axis=1)
mlb = MultiLabelBinarizer()
df = df.join(pd.DataFrame(mlb.fit_transform(df.pop('GROUPS')),
                          columns=['GROUP_'+str(x) for x in mlb.classes_],
                          index=df.index))

我想要的是一个更优雅的解决方案,它对一堆if语句进行硬编码。这些子组定义将在将来更改,并将添加新的子组。我正在努力寻找一种更好的方法来解决此问题,并欢迎提出任何建议。

0 个答案:

没有答案