如何将pandas DataFrame中列表类型列拆分为多个布尔值/0-1列
解决方案
以下两种方案均可直接在原有DataFrame基础上实现列表列转布尔/0-1列的需求:
方法1:pandas内置方法(无额外依赖)
通过str.get_dummies实现,适合小数据量场景,代码更简洁:
import pandas as pd # 你的示例DataFrame df = pd.DataFrame({'Owner': ['Bob', 'Jane', 'Amy'], 'Make': ['Ford', 'Ford', 'Jeep'], 'Model': ['Bronco', 'Bronco', 'Wrangler'], 'Sentiment': [['Meh','Red','Dirty'], ['Rusty','Sturdy'], ['Dirty','Red']], 'Max Speed': [80, 150, 69], 'Customer Rating': [90, 50, 91]}) # 生成0-1编码列 sentiment_dummies = df['Sentiment'].str.join('|').str.get_dummies() # 拼接回原表,无需保留原Sentiment列可添加.drop('Sentiment', axis=1) result = pd.concat([df, sentiment_dummies], axis=1)
方法2:基于MultiLabelBinarizer实现(适合大数据量场景)
性能优于第一种方法,适合列表标签量级较大的情况:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer df = pd.DataFrame({'Owner': ['Bob', 'Jane', 'Amy'], 'Make': ['Ford', 'Ford', 'Jeep'], 'Model': ['Bronco', 'Bronco', 'Wrangler'], 'Sentiment': [['Meh','Red','Dirty'], ['Rusty','Sturdy'], ['Dirty','Red']], 'Max Speed': [80, 150, 69], 'Customer Rating': [90, 50, 91]}) mlb = MultiLabelBinarizer() sentiment_dummies = pd.DataFrame( mlb.fit_transform(df['Sentiment']), columns=mlb.classes_, index=df.index ) # 如需布尔值而非0/1,可添加.astype(bool)转换 # sentiment_dummies = sentiment_dummies.astype(bool) result = pd.concat([df, sentiment_dummies], axis=1)
两种方案输出结果完全一致,最终生成的result中会新增所有列表中出现过的标签列,对应行存在该标签则值为1,不存在则为0。
内容的提问来源于stack exchange,提问作者Alex P
相关产品推荐
相关产品推荐

