【问题标题】:How to convert dataframe column pairs to individual dictionary mappings?如何将数据框列对转换为单个字典映射?
【发布时间】:2020-01-04 03:38:31
【问题描述】:

如何将数据框值转换成字典

D_ID    Designation  G_Code G

1       Developer       1   M
1       Developer       2   F
1       Developer       1   M
2       Testing         1   M
2       Testing         1   M
2       Testing         2   F

预计结束

d1 = {1:“开发者”,2:“测试”}

d2 = {1:“M”,2:“F”}

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    如果您事先知道哪些列需要配对,您可以创建一个pairs dict并非常巧妙地对其进行迭代:

    pairs = {'D_ID': 'Designation', 'G_Code': 'G'}
    [df.set_index(k)[v].to_dict() for k, v in pairs.items()]
    # [{1: 'Developer', 2: 'Testing'}, {1: 'M', 2: 'F'}]
    

    如果你只有两对,你可以将结果分配给“d1”和“d2”:

    d1, d2 = (df.set_index(k)[v].to_dict() for k, v in pairs.items())
    d1
    # {1: 'Developer', 2: 'Testing'}
    d2
    # {1: 'M', 2: 'F'}
    

    【讨论】:

      【解决方案2】:

      您可以使用带有参数orient='split' 的函数to_dict 将数据框转换为字典。

      df[['D_ID', 'Designation']].to_dict('split')
      

      输出:

      {'index': [0, 1, 2, 3, 4, 5],
       'columns': ['D_ID', 'Designation'],
       'data': [[1, 'Developer'],
        [1, 'Developer'],
        [1, 'Developer'],
        [2, 'Testing'],
        [2, 'Testing'],
        [2, 'Testing']]}
      

      然后您可以从结果字典中选择'data',并使用函数dict 将其转换为另一个字典。

      dct = {'D_ID': 'Designation', 'G_Code': 'G'}
      [dict(df[[k, v]].to_dict('split')['data']) for k, v in dct.items()]
      

      输出:

      [{1: 'Developer', 2: 'Testing'}, {1: 'M', 2: 'F'}]
      

      【讨论】:

        【解决方案3】:

        您可以考虑使用groupbyfirst,最后使用to_dict

        d1 = df.groupby("D_ID")["Designation"].first().to_dict()
        d2 = df.groupby("G_Code")["G"].first().to_dict()
        

        或者最终使用 @cs95 建议的对

        pairs = {'D_ID': 'Designation', 'G_Code': 'G'}
        d1, d2 = (df.groupby(k)[v].first().to_dict() for k, v in pairs.items())
        

        时间

        @cs95

        %%timeit
        pairs = {'D_ID': 'Designation', 'G_Code': 'G'}
        d1, d2 = (df.set_index(k)[v].to_dict() for k, v in pairs.items())
        
        1.06 ms ± 23.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
        

        分组方式

        %%timeit -n 100
        d1 = df.groupby("D_ID")["Designation"].first().to_dict()
        d2 = df.groupby("G_Code")["G"].first().to_dict()
        
        1.29 ms ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
        

        groupby + 对

        %%timeit -n 100
        pairs = {'D_ID': 'Designation', 'G_Code': 'G'}
        d1, d2 = (df.groupby(k)[v].first().to_dict() for k, v in pairs.items())
        
        1.4 ms ± 24.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
        

        结论

        看起来在这个例子中@cs95 解决方案是明显的赢家。但我想知道哪一个是你的真实案例的时机。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-05
          • 2019-05-14
          • 1970-01-01
          • 2014-09-12
          • 2019-05-01
          • 2021-01-08
          • 2019-05-26
          • 1970-01-01
          相关资源
          最近更新 更多