如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?相关的知识,希望对你有一定的参考价值。

假设我现在有一个带有列表的字典:

dic = { "protein1": ["func1", "func2"],
        "protein2": ["func2", "func3", "func5"],
        "protein3": ["func3", "func5"]}

和索引列表:

rows = ["protein1", "protein2", "protein3", "protein4"]

和列的列表:

columns = ["func1", "func2", "func3", "func4", "func5", "func6"]

我想将dic转换为Pandas DataFrame之类的

           func1    func2     func3    func4   func5    func6
protein1     1        1          0       0       0        0
protein2     0        1          1       0       1        0
protein3     0        0          1       0       1        0
protein4     0        0          0       0       0        0

编码这个的pythonic方法是什么?谢谢!

答案

使用MultiLabelBinarizerDataFrame.reindex

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = (pd.DataFrame(mlb.fit_transform(dic.values()),columns=mlb.classes_, index=dic.keys())
        .reindex(columns=columns, index=rows, fill_value=0))
print (df)
          func1  func2  func3  func4  func5  func6
protein1      1      1      0      0      0      0
protein2      0      1      1      0      1      0
protein3      0      0      1      0      1      0
protein4      0      0      0      0      0      0

只有熊猫解决方案是可能的,但更慢 - 使用Series.str.get_dummies

df = (pd.Series({k:'|'.join(v) for k, v in dic.items()}).str.get_dummies()
        .reindex(columns=columns, index=rows, fill_value=0))
另一答案

另一种解决方案,其输出是具有布尔值的数据帧(可以视为整数)

import numpy as np 

dic = { "protein1": ["func1", "func2"], 
        "protein2": ["func2", "func3", "func5"], 
        "protein3": ["func3", "func5"]}  

columns = ["func1", "func2", "func3", "func4", "func5", "func6"]
n = len(columns)  

# index arrays by column values 
for key, value in dic.items(): 
      newRow = np.empty(n, dtype=bool) 
      np.put(newRow, [columns.index(i) for i in value], True) 
      dic[key] = newRow 

pd.DataFrame.from_dict(dic, orient='index', columns=columns)
# Out:
#           func1  func2  func3  func4  func5  func6
# protein1   True   True  False  False  False  False
# protein2  False   True   True  False   True  False
# protein3  False  False   True  False   True  False

以上是关于如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

如何查找包含列和列的所有表

如何绘制日期时间索引数据框中特定列的手动箱线图?

python3列表

在python中合并具有不同长度和列的数据框列表

在python列表中查找特定列的元素的索引

带有列表视图和列的颤振布局