我有一个dataframe,其中一列是我的每个用户所属的组的列表。类似于:
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'])
因为这只会为我的列中的每个不同列表返回一列。
解决方案需要高效,因为 Dataframe 将包含500,000+行。
6条答案
按热度按时间njthzxwz1#
将
s
用于您的df['groups']
:这是一个可能的解决方案:
其逻辑是:
.explode()
将一系列列表展平为一系列单个值(索引跟踪原始行号)pd.get_dummies( )
创建虚拟对象.groupby(level=0).sum()
,用于组合应该是一行的不同行(通过按索引(level=0
)(即原始行号)分组求和)我不知道这是否足够有效,但无论如何,如果性能很重要,将列表存储在dataframe中不是一个好主意。
原始答案后更新
s.explode()
可以用来扁平化Series列表,而不是原来的s.apply(pd.Series).stack()
df.groupby(level=0).sum()
而不是df.sum(level=0)
wfveoks02#
***非常快速的解决方案,如果您有一个大的 Dataframe ***
使用sklearn.preprocessing.MultiLabelBinarizer
结果:
对我有效,也建议使用here和here
gpfsuwkq3#
这样更快:
pd.get_dummies(df['groups'].explode()).sum(level=0)
使用
.explode()
代替.apply(pd.Series).stack()
与其他解决方案相比:
x9ybnkn64#
尽管这个问题已经解决了,但我有一个更快的解决方案:
而且,如果你有空组或
NaN
,你可以:工作原理
在lambda中,
x
是你的列表,例如['a', 'b', 'c']
。所以pd.Series
将如下:当所有的
pd.Series
聚集在一起时,它们变成pd.DataFrame
,它们的index
变成columns
;缺失的index
变成了column
,NaN
如下所示:现在
fillna
用0
填充那些NaN
:downcast='infer'
从float
向下转换到int
:注:不需要使用
.fillna(0, downcast='infer')
。nx7onnlm5#
你可以使用
str.join
将list中的所有元素串联成string,然后使用str.get_dummies
:yjghlzjz6#
您可以使用
explode
和crosstab
:输出: