python - 如何用列表中的单词制作二进制熊猫矩阵?
问题描述
我有一个数据框,其中有一列包含每一行的列表:
df['list1'][0] = ['a','b','c','d']
df['list1'][1] = [,'b','c','d', 'e']
现在我想从中创建一个二进制矩阵,将字母作为列名,如果该行上的列表包含字母,则为 1,如果不是 0。我找不到解决方案。有人可以帮我吗?
解决方案
如果性能很重要,请使用MultiLabelBinarizer:
df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']]})
print (df)
list1
0 [a, b, c, d]
1 [b, c, d, e]
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df['list1']),columns=mlb.classes_)
或get_dummies
与DataFrame
构造函数:
df1 = (pd.get_dummies(pd.DataFrame(df['list1'].values.tolist()), prefix_sep='', prefix='')
.max(level=0, axis=1))
另一种解决方案,但如果使用大数据会很Series.str.join
慢Series.str.get_dummies
:
df1 = df['list1'].str.join('|').str.get_dummies()
print (df1)
a b c d e
0 1 1 1 1 0
1 0 1 1 1 1
编辑:如果需要删除list1
列的原始列DataFrame.pop
用于提取列DataFrame.join
:
df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']],
'col1':[1,2],
'col2':list('XY')})
print (df)
list1 col1 col2
0 [a, b, c, d] 1 X
1 [b, c, d, e] 2 Y
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df.pop('list1')),columns=mlb.classes_, index=df.index)
print (df1)
a b c d e
0 1 1 1 1 0
1 0 1 1 1 1
df1 = (pd.get_dummies(pd.DataFrame(df.pop('list1').values.tolist()), prefix_sep='', prefix='')
.max(level=0, axis=1))
df1 = df.pop('list1').str.join('|').str.get_dummies()
df = df.join(df1)
print (df)
col1 col2 a b c d e
0 1 X 1 1 1 1 0
1 2 Y 0 1 1 1 1
推荐阅读
- ggplot2 - ggplot2 扩展调色板
- javascript - 在 Atom 中编写 JavaScript 时启用自动完成功能的最佳扩展
- javascript - Mixitup Javascript 在 Internet Explorer 中不起作用
- javascript - Uncaught SyntaxError: Unexpected token '<' VueJS PWA
- python - 不一致的 pool.map 行为
- java - 在 Android 中拦截 WebView 请求
- python - 当 django 在 docker 下运行时,将 python 函数作为命令行运行
- hadoop - HIVE时间转换问题
- mysql - 用 MySQL 连接 3 个表
- powershell - 如何在不在客户端计算机上安装 RSAT 工具的情况下通过 powershell 查询域用户的 Active Directory