列表列的Pandas get_dummies,其中该列中的单元格可能没有值

问题描述

我在数据框中有一个列,其中所有值都是列表(通常每行列出一个项目)。因此,我想使用get_dummies对所有值进行一次热编码。但是,可能有几行没有该列的值。我最初将其视为nan,然后将其替换为空列表,但是无论哪种情况,对于get_dummies的结果,我都看不到0和1s,但是每个生成的列都是空白的(我希望每个生成的列为0)。

如何让get_dummies处理空白列表?

# create column from dict where value will be a list
X['sponsor_list'] = X['bill_id'].map(sponsor_non_plaw_dict)
# line to replace nan in sponsor_list column with empty list
X.loc[X['sponsor_list'].isnull(),['sponsor_list']] =    X.loc[X['sponsor_list'].isnull(),'sponsor_list'].apply(lambda x: [])
# use of get_dummies to encode the sponsor_list column
X = pd.concat([X,pd.get_dummies(X.sponsor_list.apply(pd.Series).stack()).sum(level=0)],axis=1)

示例:

111th-congress_senate-bill_3695.txt False ['Menendez,_Robert_[D-NJ].txt']
112th-congress_house-bill_3630.txt False []
111th-congress_senate-bill_852.txt False ['Vitter,_David_[R-LA].txt']
114th-congress_senate-bill_2832.txt False
['Isakson,_Johnny_[R-GA].txt']
107th-congress_senate-bill_535.txt False ['Bingaman,_Jeff_[D-NM].txt']

我想在第三列进行一次热编码。第二行中的特定数据项没有人与之关联,因此我需要将该行编码为全0。我需要第三列作为列表的原因是因为我也需要对相关列执行此操作,在该列中我需要具有[0,n]值,其中n可以是5或10甚至20。

解决方法

X['sponsor_list'] = X['bill_id'].map(sponsor_non_plaw_dict)
X.loc[X['sponsor_list'].isnull(),['sponsor_list']] = X.loc[X['sponsor_list'].isnull(),'sponsor_list'].apply(lambda x: [])
mlb = MultiLabelBinarizer()
X = X.join(pd.DataFrame(mlb.fit_transform(X.pop('sponsor_list')),columns=mlb.classes_,index=X.index))

我使用MultiLabelBinarizer捕获了我想做的事情。在应用之前,我仍然用空列表替换nan,但是随后我使用fit_transform创建0/1值,该值可能导致连续1个或连续1个。