python - 将嵌套字典转换为多级数据帧

标签 python python-2.7 pandas export-to-csv

我有一本看起来像这样的字典。

{ '11457': { 'Client Orders': { 'Z07640C': 422,
                                'Z04276B': 93,
                                'Z15421A': 178,
                                'Z77679': 4},
             'Name': 'SANDY',
             'Total Orders': 697},
  '1191': { 'Client Orders': { 'Z03456B': 101,
                               'Z10424A': 754,
                               'Z10453SR': 84,
                               'Z13454': 658,
                               'Z13846': 279},
            'Name': 'Deep',
            'Total Orders': 1876},
  '13139': { 'Client Orders': { 'Z32421A': 2,
                                'Z43487B': 24,
                                'Z44411LR': 6,
                                'Z54611SR': 2},
             'Name': 'Sran',
             'Total Orders': 34}}

我想将其转换为如下所示的数据框。

| Code | Name | Total | Trading Account | Count |
|11475 | SANDY| 697   | Z07640C         | 422   |
|      |      |       | Z04276B         | 93    |
...
|13139 |Sran  | 34    | Z32421A         | 2     |
|      |      |       | Z43487B         | 24    |
...

我的主键是代码,辅助键是名称。

当我将其导出到 csv 时,我希望它看起来像这样。

最佳答案

concat字典理解结合使用,通过reset_indexMultiIndex转换为列,最后重命名列:

d = { '11457': { 'Client Orders': { 'Z07640C': 422,
                                'Z04276B': 93,
                                'Z15421A': 178,
                                'Z77679': 4},
             'Name': 'SANDY',
             'Total Orders': 697},
  '1191': { 'Client Orders': { 'Z03456B': 101,
                               'Z10424A': 754,
                               'Z10453SR': 84,
                               'Z13454': 658,
                               'Z13846': 279},
            'Name': 'Deep',
            'Total Orders': 1876},
  '13139': { 'Client Orders': { 'Z32421A': 2,
                                'Z43487B': 24,
                                'Z44411LR': 6,
                                'Z54611SR': 2},
             'Name': 'Sran',
             'Total Orders': 34}}
<小时/>
d1 = {'level_0':'Code','level_1':'Trading Account'}
df = pd.concat({k: pd.DataFrame(v) for k,v in d.items()}).reset_index().rename(columns=d1)
print (df)
     Code Trading Account  Client Orders   Name  Total Orders
0   11457         Z04276B             93  SANDY           697
1   11457         Z07640C            422  SANDY           697
2   11457         Z15421A            178  SANDY           697
3   11457          Z77679              4  SANDY           697
4    1191         Z03456B            101   Deep          1876
5    1191         Z10424A            754   Deep          1876
6    1191        Z10453SR             84   Deep          1876
7    1191          Z13454            658   Deep          1876
8    1191          Z13846            279   Deep          1876
9   13139         Z32421A              2   Sran            34
10  13139         Z43487B             24   Sran            34
11  13139        Z44411LR              6   Sran            34
12  13139        Z54611SR              2   Sran            34

要导出到csv,请使用to_csv:

df.to_csv(filename, index=False)

编辑要删除重复项,需要将其替换为 NaN,在 to_csv 中省略 NaN:

mask = df['Code'].duplicated()
df[['Code', 'Name', 'Total Orders']] = df[['Code', 'Name', 'Total Orders']].mask(mask)
print (df)
     Code Trading Account  Client Orders   Name  Total Orders
0   11457         Z04276B             93  SANDY         697.0
1     NaN         Z07640C            422    NaN           NaN
2     NaN         Z15421A            178    NaN           NaN
3     NaN          Z77679              4    NaN           NaN
4    1191         Z03456B            101   Deep        1876.0
5     NaN         Z10424A            754    NaN           NaN
6     NaN        Z10453SR             84    NaN           NaN
7     NaN          Z13454            658    NaN           NaN
8     NaN          Z13846            279    NaN           NaN
9   13139         Z32421A              2   Sran          34.0
10    NaN         Z43487B             24    NaN           NaN
11    NaN        Z44411LR              6    NaN           NaN
12    NaN        Z54611SR              2    NaN           NaN

关于python - 将嵌套字典转换为多级数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49126063/

相关文章:

python - Python中二维网格图中的邻接矩阵问题

python - 如何使用 mechanize 库执行 HEAD 请求?

Python 脚本手动运行良好,但在使用 Cronjob 运行时出错

python - 如何在Python中删除重复的短语?

python - 找到*最*常见的字符串前缀 - 更好的方法?

python - Pandas 数据框按列比较 2 组的字符串值

python - Pandas:对于 groupby value_counts,返回具有最大计数的行

python - 快速 API 接受必填字段的空值

python - 将数据框中的负值转换为正值 - Python

python-2.7 - 类型错误 : integer argument expected, 得到 float python 2.7