如果它属于列表,则将列表列转换为 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.explode
和crosstab
并测试如果不是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 列的主要内容,如果未能解决你的问题,请参考以下文章