创建布尔数据框,显示列表字典中每个元素的存在

Posted

技术标签:

【中文标题】创建布尔数据框,显示列表字典中每个元素的存在【英文标题】:Create boolean dataframe showing existance of each element in a dictionary of lists 【发布时间】:2019-01-10 13:23:23 【问题描述】:

我有一个列表字典,并且我构建了一个数据框,其中索引是字典键,列是列表中包含的可能值的集合。数据框值表示字典中包含的每个列表的每一列的存在。构建它的最有效方法是什么?下面是我现在使用 for 循环完成的方法,但我确信使用矢量化或连接有更有效的方法。

import pandas as pd

data = 0:[1,2,3,4],1:[2,3,4],2:[3,4,5,6]
cols = sorted(list(set([x for y in data.values() for x in y])))
df = pd.DataFrame(0,index=data.keys(),columns=cols)

for row in df.iterrows():
  for col in cols:
    if col in data[row[0]]:
      df.loc[row[0],col] = 1
    else:
      df.loc[row[0],col] = 0

print(df)

输出:

       1  2  3  4  5  6
    0  1  1  1  1  0  0
    1  0  1  1  1  0  0
    2  0  0  1  1  1  1

【问题讨论】:

【参考方案1】:

使用MultiLabelBinarizer:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()

df = pd.DataFrame(mlb.fit_transform(data.values()),
                  columns=mlb.classes_,
                  index=data.keys())
print (df)
   1  2  3  4  5  6
0  1  1  1  1  0  0
1  0  1  1  1  0  0
2  0  0  1  1  1  1

纯熊猫,但使用str.get_dummies 的解决方案要慢得多:

df = pd.Series(data).astype(str).str.strip('[]').str.get_dummies(', ')

【讨论】:

以上是关于创建布尔数据框,显示列表字典中每个元素的存在的主要内容,如果未能解决你的问题,请参考以下文章

python基础04--基本数据类型(列表元组字典)

字典 列表

基本数据类型-列表_元组_字典_day4

查找作为列表存在的列元素的数据框索引的最快方法

R:根据列表元素名称创建新的数据框变量

第八篇基本数据类型之列表元组与字典