【问题标题】:How to use Pandas to create Dictionary from column entries in DataFrame or np.array如何使用 Pandas 从 DataFrame 或 np.array 中的列条目创建字典
【发布时间】:2016-02-14 10:37:24
【问题描述】:

所以我有一个DataFrame,我将列标记为 a - i。我想做一个Dictionary of Dictionaries,其中外键是“a”列,内键是“d”列,值是“e”。我知道如何通过遍历每一行来做到这一点,但我觉得使用DataFrame.to_dict() 有一种更有效的方法来做到这一点,但我不知道如何......也许DataFrame.group_by 可以提供帮助,但这似乎用于对列或索引 ID 进行分组。

如何使用pandas(或numpy)高效地创建Dictionary of Dictionaries,而无需遍历每一行?我已经展示了我当前方法的示例以及所需的输出应该如下所示。

#!/usr/bin/python
import numpy as np
import pandas as pd

tmp_array = np.array([['AAA', 86880690, 86914111, '22RV1', 2, 2, 'H', '-'], ['ABA', 86880690, 86914111, 'A549', 2, 2, 'L', '-'], ['AAC', 86880690, 86914111, 'BFTC-905', 3, 3, 'H', '-'], ['AAB', 86880690, 86914111, 'BT-20', 2, 2, 'H', '-'], ['AAA', 86880690, 86914111, 'C32', 2, 2, 'H', '-']])

DF = pd.DataFrame(tmp_array,columns=["a,b,c,d,e,g,h,i".split(",")])

#print(DF)
a         b         c         d  e  g  h  i
0  AAA  86880690  86914111     22RV1  2  2  H  -
1  ABA  86880690  86914111      A549  2  2  L  -
2  AAC  86880690  86914111  BFTC-905  3  3  H  -
3  AAB  86880690  86914111     BT-20  2  2  H  -
4  AAA  86880690  86914111       C32  2  2  H  -

from collections import defaultdict
from itertools import izip

D_a_d_e = defaultdict(dict)
for a,d,e in izip(DF["a"],DF["d"],DF["e"]):
    D_a_d_e[a][d] = e

#print(D_a_d_e)
#ignore the defaultdict part

defaultdict(<type 'dict'>, {'ABA': {'A549': '2'}, 'AAA': {'22RV1': '2', 'C32': '2'}, 'AAC': {'BFTC-905': '3'}, 'AAB': {'BT-20': '2'}})

我看到了这个https://stackoverflow.com/questions/28820254/how-to-create-a-pandas-dataframe-using-a-dictionary-in-a-single-column,但它有点不同,它也没有答案。

【问题讨论】:

    标签: python numpy dictionary pandas dataframe


    【解决方案1】:

    有一个to_dict 方法:

    In [11]: DF.to_dict()
    Out[11]:
    {'a': {0: 'AAA', 1: 'ABA', 2: 'AAC', 3: 'AAB', 4: 'AAA'},
     'b': {0: '86880690', 1: '86880690', 2: '86880690' 3: '86880690', 4: '86880690'},
     'c': {0: '86914111', 1: '86914111', 2: '86914111', 3: '86914111', 4: '86914111'},
     'd': {0: '22RV1', 1: 'A549', 2: 'BFTC-905', 3: 'BT-20', 4: 'C32'},
     'e': {0: '2', 1: '2', 2: '3', 3: '2', 4: '2'},
     'g': {0: '2', 1: '2', 2: '3', 3: '2', 4: '2'},
     'h': {0: 'H', 1: 'L', 2: 'H', 3: 'H', 4: 'H'},
     'i': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-'}}
    
    In [12]: DF.to_dict(orient="index")
    Out[12]:
    {0: {'a': 'AAA', 'b': '86880690', 'c': '86914111', 'd': '22RV1', 'e': '2', 'g': '2', 'h': 'H', 'i': '-'},
     1: {'a': 'ABA', 'b': '86880690', 'c': '86914111', 'd': 'A549', 'e': '2', 'g': '2', 'h': 'L', 'i': '-'},
     2: {'a': 'AAC', 'b': '86880690', 'c': '86914111', 'd': 'BFTC-905', 'e': '3', 'g': '3', 'h': 'H', 'i': '-'},
     3: {'a': 'AAB', 'b': '86880690', 'c': '86914111', 'd': 'BT-20', 'e': '2', 'g': '2', 'h': 'H', 'i': '-'},
     4: {'a': 'AAA', 'b': '86880690', 'c': '86914111', 'd': 'C32', 'e': '2', 'g': '2', 'h': 'H', 'i': '-'}}
    

    考虑到这一点,您可以进行分组:

    In [21]: DF.set_index("d").groupby("a")[["e"]].apply(lambda x: x["e"].to_dict())
    Out[21]:
    a
    AAA    {'C32': '2', '22RV1': '2'}
    AAB                {'BT-20': '2'}
    AAC             {'BFTC-905': '3'}
    ABA                 {'A549': '2'}
    dtype: object
    

    也就是说,您可以直接使用 MultiIndex 而不是字典:

    In [31]: res = DF.set_index(["a", "d"])["e"]
    
    In [32]: res
    Out[32]:
    a    d
    AAA  22RV1       2
    ABA  A549        2
    AAC  BFTC-905    3
    AAB  BT-20       2
    AAA  C32         2
    Name: e, dtype: object
    

    它的工作方式大致相同:

    In [33]: res["AAA"]
    Out[33]:
    d
    22RV1    2
    C32      2
    Name: e, dtype: object
    
    In [34]: res["AAA"]["22RV1"]
    Out[34]: '2'
    

    但是会更节省空间/你还在 pandas 中。

    【讨论】:

      【解决方案2】:

      类似的东西:

      def dictmaker(df): 
          """
          wrapper for storing key, values in dict. Takes df.
          """
          dct={}  ## storage
          dct[df.d.values[0]]=df.e.values[0]
          return dct
      
      DF[['a','d','e']].groupby('a').apply(dictmaker)
      
      a
      AAA       {u'22RV1': u'2'}
      AAB       {u'BT-20': u'2'}
      AAC    {u'BFTC-905': u'3'}
      ABA        {u'A549': u'2'}
      dtype: object
      

      【讨论】:

      • 实际上,我的解决方案并不能完全满足您的要求——嵌套字典。我的仍然生活在索引数据框中。 @ali_m 的解决方案可助您一臂之力。
      猜你喜欢
      • 2015-11-07
      • 2019-01-07
      • 2019-02-10
      • 2020-01-22
      • 2015-10-29
      • 1970-01-01
      • 2021-06-20
      • 2017-10-03
      • 2019-02-08
      相关资源
      最近更新 更多