Pandas如何将列表类型列转换为对应值的二进制存在标识列
问题背景
初始数据集构造代码如下:
import pandas as pd #Create Series s = pd.Series([[1,2,3,],[1,10,11],[2,11,12]],['buz','bas','bur']) k = pd.Series(['y','n','o'],['buz','bas','bur']) #Create DataFrame df from two series df = pd.DataFrame({'first':s,'second':k})
已经完成的操作:基于first列的所有唯一值提前创建了初始值为0的新列,实现代码如下:
def text_to_list(df,col): val=df[col].explode().unique() return val unique=text_to_list(df,'first') for options in unique : df[options]=0
当前需求:给新创建的数值列赋值,若列名对应的数值存在于该行first列的列表中,对应位置赋值为1,否则保留0。预期最终输出如下:
first second 1 2 3 10 11 12 buz [1, 2, 3] y 1 1 1 0 0 0 bas [1, 10, 11] n 1 0 0 1 1 0 bur [2, 11, 12] o 0 1 0 0 1 1
实现方案
方案1:基于已有建列逻辑补充赋值
在现有代码的基础上,新增遍历判断逻辑即可完成赋值:
for col in unique: df[col] = df['first'].apply(lambda x: 1 if col in x else 0)
方案2:更简洁的无前置建列方案
该方案无需提前调用explode创建新列,一行代码即可完成所有操作:
df1=df.join(pd.get_dummies(df['first'].apply(pd.Series).stack()).sum(level=0)) print(df1)
逻辑说明:先将first列的列表元素拆分为单独的行,通过get_dummies生成独热编码,再按原始索引聚合求和,最后和原DataFrame拼接,直接得到符合要求的结果。
内容的提问来源于stack exchange,提问作者kdot
相关产品推荐
相关产品推荐

