Python 一种基于列标题的热编码数据帧

Python 一种基于列标题的热编码数据帧,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,我以前从未这样做过——也许有一种更简单的方法可以做到这一点 我有这样一个df: 这是我手工制作的。我最初从两个数据帧开始: 1:df1,仅父组织名称作为唯一列 #df1 parent_org_name 0 +MARTINS 1 111 SOUTH 2 247 CUSTOMER PVT. LTD. 3 3M 4 A. K. ENTERPRISE 2:df2,所有列名+MA、MAR、ART等在一行一列中的一个列表中 #df2 parent_trigram 0 [+MA, M

我以前从未这样做过——也许有一种更简单的方法可以做到这一点

我有这样一个df:

这是我手工制作的。我最初从两个数据帧开始:

1:df1,仅父组织名称作为唯一列

#df1
parent_org_name
0   +MARTINS
1   111 SOUTH
2   247 CUSTOMER PVT. LTD.
3   3M
4   A. K. ENTERPRISE
2:df2,所有列名+MA、MAR、ART等在一行一列中的一个列表中

#df2
parent_trigram
0   [+MA, MAR, ART, RTI, TIN]
我试图按字母顺序排列这些列,然后对这个df进行热编码,表示:

这就是我想要的结果:

parent_org_name (+MA,)  (ART,)  (MAR,)  (RTI,)  (TIN,)
0   +MARTINS    1        1       1       1      1
1   111 SOUTH   0        0       0       0      0   
2   247 CUST    0        0       0       0      0
3   3M          0        0       0       0      0   
4   A. K. ENT   0        0       0       0      0   
最终目标是将这些行中的每一行合并成一列列表,然后在ml模型中使用该列

df = pd.DataFrame({
    'parent_org_name' : ["+MARTINS", "111 SOUTH", "247 CUST", "3M", "A. K. ENT"]
})

for c in ['+MA', 'MAR', 'ART', 'RTI', 'TIN']:
  df[c] = df['parent_org_name'].apply(lambda x: int(c in x))

print (df)
输出

parent_org_name +MA MAR ART RTI TIN
0   +MARTINS    1   1   1   1   1
1   111 SOUTH   0   0   0   0   0
2   247 CUST    0   0   0   0   0
3   3M          0   0   0   0   0
4   A. K. ENT   0   0   0   0   0

以下是我的想法:

mlb = MultiLabelBinarizer(sparse_output=True)

mlb_df = df.join(
            pd.DataFrame.sparse.from_spmatrix(
                mlb.fit_transform(df.pop('parent_trigram')),
                index=df.index,
                columns=mlb.classes_))
mlb_df
结果如下:

这是str.contains不确定是否有帮助,但是-文档
parent_org_name +MA MAR ART RTI TIN
0   +MARTINS    1   1   1   1   1
1   111 SOUTH   0   0   0   0   0
2   247 CUST    0   0   0   0   0
3   3M          0   0   0   0   0
4   A. K. ENT   0   0   0   0   0
mlb = MultiLabelBinarizer(sparse_output=True)

mlb_df = df.join(
            pd.DataFrame.sparse.from_spmatrix(
                mlb.fit_transform(df.pop('parent_trigram')),
                index=df.index,
                columns=mlb.classes_))
mlb_df