简体   繁体   English

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

[英]Convert nested dictionary to multilevel dataframe

I have a dictionary which looks like this. 我有一本像这样的字典。

{ '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}}

I want to convert this to into a dataframe which looks like. 我想将其转换为一个看起来像的数据框。

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

My primary key is the code and the secondary key is Name. 我的主键是代码,辅助键是Name。

I want it to look like this when I export it to csv. 我希望将其导出到csv时看起来像这样。

Use concat with dict comprehension , convert MultiIndex to columns by reset_index and last rename columns: concatdict comprehension一起使用,通过reset_indexMultiIndex转换为列,并最后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

For export to csv use to_csv : 要导出到csv使用to_csv

df.to_csv(filename, index=False)

EDIT For remove duplicates need replace them to NaN s, in to_csv are NaN s omited: 编辑要删除重复项,需要将其替换为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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM