【问题标题】:How to unfold a dictionary of dictionaries into a pandas DataFrame for larger dictionaries?如何将字典展开成 pandas DataFrame 以获取更大的字典?
【发布时间】:2019-04-24 15:51:00
【问题描述】:

考虑以下python3.x中的字典

dict1 = {4: {4:25, 5:39, 3:42}, 5:{24:94, 252:49, 25:4, 55:923}}

我想将其展开为 pandas DataFrame。似乎有两种选择:

df1 = pd.DataFrame.from_dict(dict1, orient='columns')

print(df1)
        4      5
3    42.0    NaN
4    25.0    NaN
5    39.0    NaN
24    NaN   94.0
25    NaN    4.0
55    NaN  923.0
252   NaN   49.0

其中列是主字典键 4 和 `5',行索引是子字典键,值是子字典值。

另一个选项是

df2 = pd.DataFrame.from_dict(dict1, orient='index')
print(df2)
    4     5     3     24    252  25     55 
4  25.0  39.0  42.0   NaN   NaN  NaN    NaN
5   NaN   NaN   NaN  94.0  49.0  4.0  923.0

其中列是内部“子字典”的键,行索引是主字典的键,值是子字典的键。

是否有一种标准方法可以让我们按如下方式展开 python 字典?

key inner_key values
4        3      42 
4        4      25
4        5      39
5        24     94
5        25     4
5        55     923
5        252    49

使用from_dict() 后最好不要操作DataFrame,因为对于更大的python 字典,这可能会占用大量内存。

【问题讨论】:

    标签: python python-3.x pandas dictionary dataframe


    【解决方案1】:

    列表理解

    列表推导应该相当有效:

    dict1 = {4: {4:25, 5:39, 3:42}, 5: {24:94, 252:49, 25:4, 55:923}}
    
    cols = ['key', 'inner_key', 'values']
    
    df = pd.DataFrame([[k1, k2, v2] for k1, v1 in dict1.items() for k2, v2 in v1.items()],
                      columns=cols).sort_values(cols)
    
    print(df)
    
       key  inner_key  values
    2    4          3      42
    0    4          4      25
    1    4          5      39
    3    5         24      94
    5    5         25       4
    6    5         55     923
    4    5        252      49
    

    pd.melt + dropna

    如果您不介意使用df1 工作,您可以通过pd.melt 取消透视您的数据框,然后删除带有空value 的行。

    df1 = df1.reset_index()
    
    res = pd.melt(df1, id_vars='index', value_vars=[4, 5])\
            .dropna(subset=['value']).astype(int)
    
    print(res)
    
        index  variable  value
    0       3         4     42
    1       4         4     25
    2       5         4     39
    10     24         5     94
    11     25         5      4
    12     55         5    923
    13    252         5     49
    

    【讨论】:

    • 感谢您的解释!非常感谢
    【解决方案2】:
    pd.DataFrame([[i,j,user_dict[i][j] ] for i in user_dict.keys() for j in user_dict[i].keys()],columns=['key', 'inner_key', 'values'])
    

    输出:

       key  inner_key   values
    0   4   4           25
    1   4   5           39
    2   4   3           42
    3   5   24          94
    4   5   252         49
    5   5   25          4
    6   5   55         923
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 2019-03-05
      • 2017-12-26
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多