Python 一种基于列标题的热编码数据帧
我以前从未这样做过——也许有一种更简单的方法可以做到这一点 我有这样一个df: 这是我手工制作的。我最初从两个数据帧开始: 1:df1,仅父组织名称作为唯一列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
#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