我有一个数据框,其中包含特定公司的员工数据。数据框具有五列(EMP_ID,COUNTRY,FUNCTIONAL_AREA,SPECIALTY,GENDER)。
我还有一个csv,它定义了整个数据集的子组。一个例子是:
等等,依此类推。如您所见,每个员工都可以属于多个子组,并且大多数时候都可以。我需要做的是获取这些已定义的子组,并将该数据添加到原始数据框中。
我能够创建一个在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语句进行硬编码。这些子组定义将在将来更改,并将添加新的子组。我正在努力寻找一种更好的方法来解决此问题,并欢迎提出任何建议。