将嵌套字典转换为多级数据框

Convert nested dictionary to multilevel dataframe

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

{ '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 with dict comprehension, convert MultiIndex to columns by reset_index 和最后 rename 列:

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)

编辑为了删除重复项需要将它们替换为 NaNs,在 to_csv 中省略了 NaNs:

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