如果它属于列表,则将列表列转换为 True/False 列

Posted

技术标签:

【中文标题】如果它属于列表,则将列表列转换为 True/False 列【英文标题】:Convert column of lists to columns of True/False if it belongs to the lists 【发布时间】:2021-12-18 16:22:42 【问题描述】:

我有以下数据框

    Codice  Sem CFU Rating  Gruppo
0   51132   1   10  0.0 [STAT]
1   51197   1   5   0.0 [ING]
2   52354   1   5   0.0 [ING]
3   52496   1   10  0.0 [MST]
4   52498   2   10  0.0 [MST]
... ... ... ... ... ...
57  97667   1   8   3.0 [MTM]
58  97673   2   8   0.0 [MTM]
59  97683   2   5   5.0 [STAT, ING]
60  97690   2   12  0.0 [MST]
61  97725   2   10  0.0 [CSCL, MTM]

如您所见,Gruppo 列由有限数量的唯一元素组成的列表。我正在尝试从中生成一个 DF 以在 pulp 中使用,例如“如果 Codice 属于 Gruppo”,因此我需要一个 DF(或矩阵,但我想使用 Codice 进行索引而不仅仅是一个普通的整数)是这样制作的:

    Codice  STAT    ING ... MST
0   51132   True    False   ... False
1   51197   False   True    ... False

对应的列表是否包含ING,STAT,MST,...基本上是True/False

【问题讨论】:

【参考方案1】:

如果Codice 是或不是唯一的一般解决方案使用DataFrame.explodecrosstab 并测试如果不是0

df1 = df.explode('Gruppo')
df2 = pd.crosstab(df1['Codice'], df1['Gruppo']).ne(0).reset_index()

或使用MultiLabelBinarizer 和聚合max 并比较相等的1

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df2 = (pd.DataFrame(mlb.fit_transform(df['Gruppo']),
                    columns=mlb.classes_, 
                    index=df['Codice']).groupby(level=0).max().eq(1))

如果Codice 中的值是唯一的,则可以删除聚合:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df2 = (pd.DataFrame(mlb.fit_transform(df['Gruppo']),
                    columns=mlb.classes_, 
                    index=df['Codice']).eq(1))

【讨论】:

以上是关于如果它属于列表,则将列表列转换为 True/False 列的主要内容,如果未能解决你的问题,请参考以下文章

将大列表转换为一列包含所有元素的小标题[重复]

如果满足条件,则将正数更改为负数

sqlplus 添加列标题

Pyspark 将列表列转换为嵌套结构列

如何在 ColdFusion 中将查询列转换为列表

如果列表项为空,则将可见性设置为消失