微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas将列表列表转换为dummies

我有一个数据框,其中一列是我的每个用户所属的组列表.就像是:

index groups  
0     ['a','b','c']
1     ['c']
2     ['b','c','e']
3     ['a','c']
4     ['b','e']

我想要做的是创建一系列虚拟列,以确定每个用户所属的组,以便运行一些分析

index  a   b   c   d   e
0      1   1   1   0   0
1      0   0   1   0   0
2      0   1   1   0   1
3      1   0   1   0   0
4      0   1   0   0   0


pd.get_dummies(df['groups'])

将无法工作,因为它只返回列中每个不同列表的列.

解决方案需要高效,因为数据帧将包含500,000行.任何意见,将不胜感激!

解决方法:

使用s作为你的df [‘groups’]:

In [21]: s = pd.Series({0: ['a', 'b', 'c'], 1:['c'], 2: ['b', 'c', 'e'], 3: ['a', 'c'], 4: ['b', 'e'] })

In [22]: s
Out[22]:
0    [a, b, c]
1          [c]
2    [b, c, e]
3       [a, c]
4       [b, e]
dtype: object

这是一个可能的解决方案:

In [23]: pd.get_dummies(s.apply(pd.Series).stack()).sum(level=0)
Out[23]:
   a  b  c  e
0  1  1  1  0
1  0  0  1  0
2  0  1  1  1
3  1  0  1  0
4  0  1  0  1

这个逻辑是:

> .apply(Series)将一系列列表转换为数据帧
> .stack()将所有内容重新放在一列中(创建多级索引)
> pd.get_dummies()创建假人
> .sum(level = 0)用于重新合并应该是一行的不同行(通过总结第二级,仅保留原始级别(级别= 0))

略有不同的是pd.get_dummies(s.apply(pd.Series),prefix =”,prefix_sep =”).sum(level = 0,axis = 1)

如果这个效率足够高,我不知道,但无论如何,如果性能很重要,那么在数据帧中存储列表并不是一个好主意.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐