如何将熊猫中的一列列表转换为Python中唯一值的稀疏DataFrame [重复]

Posted

技术标签:

【中文标题】如何将熊猫中的一列列表转换为Python中唯一值的稀疏DataFrame [重复]【英文标题】:How to turn a column of lists in pandas to a sparse DataFrame of the unique values in Python [duplicate] 【发布时间】:2020-04-02 08:03:57 【问题描述】:

对于每一行 id,我都有一个作为 pandas 列的值列表。 结构如下:

df = 'id1':[['a','b','c','d']],'id2':[['a','d','e','j']],'id3':[['b','d','i','q']],
df = pd.DataFrame.from_dict(df,orient='index')

这给了我:

起初,我使用以下代码在旁边创建了一组唯一值:

l = df.values.tolist()
flat_set = item for sublist in l for item in sublist

最后,我需要得到一个稀疏版本:

注意事项:

    没有。集合中的唯一值 - 100K~ 没有。 ids - 60K~

如果缩短列的名称会导致 减少记忆, 但对我来说,从列表中解包到稀疏是困难的部分。

请帮忙:)

【问题讨论】:

【参考方案1】:

MultiLabelBinarizerDataFrame 构造函数一起使用:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(df[0]),columns=mlb.classes_, index=df.index)
print (df)
     a  b  c  d  e  i  j  q
id1  1  1  1  1  0  0  0  0
id2  1  0  0  1  1  0  1  0
id3  0  1  0  1  0  1  0  1

编辑:对于稀疏 DataFrame,将 sparse_output=True 添加到 MultiLabelBinarizer 并使用 DataFrame.sparse.from_spmatrix

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer(sparse_output=True)
a = mlb.fit_transform(df[0])

df = df = pd.DataFrame.sparse.from_spmatrix(a, columns=mlb.classes_, index=df.index)
print (df)
     a  b  c  d  e  i  j  q
id1  1  1  1  1  0  0  0  0
id2  1  0  0  1  1  0  1  0
id3  0  1  0  1  0  1  0  1

print (df.dtypes)
a    Sparse[int32, 0]
b    Sparse[int32, 0]
c    Sparse[int32, 0]
d    Sparse[int32, 0]
e    Sparse[int32, 0]
i    Sparse[int32, 0]
j    Sparse[int32, 0]
q    Sparse[int32, 0]
dtype: object

【讨论】:

df[0] 指的是什么? @Talis - 列名0,可能需要df['package'] 工作了,但是,我可以在声明 df 时强制它稀疏吗?在这里: df = pd.DataFrame(mlb.fit_transform(df[0]),columns=mlb.classes_, index= df.index) @Talis - 答案已编辑。

以上是关于如何将熊猫中的一列列表转换为Python中唯一值的稀疏DataFrame [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫系列时间戳转换为唯一日期列表

熊猫将具有相同索引的一列值组合到列表中[重复]

如何将用熊猫提取的一列excel数据中的NaN替换为0

如何将熊猫系列的列值转换为Python中的列表?

将 Pandas 中的一列转换为一个长字符串(Python 3)

如何将包含列表的列转换为熊猫数据框中的单独列? [复制]