用dict作为行提取特定列

时间:2019-07-10 13:39:48

标签: python pandas dictionary

id  numbers
1   {'105': 1, '65': 11, '75': 0, '85': 51, '95': 0}
2   {'105': 1, '65': 11, '75': 0, '85': 50, '95': 0}
3   {'105': 1, '65': 11, '75': 0, '85': 51, '95': 0}
4   {}
5   {}
6   {}
7   {'75 cm': 7, '85 cm': 52, '95 cm': 10}
8   {'75 cm': 51, '85 cm': 114, '95 cm': 10}
9   {'75 cm': 9, '85 cm': 60, '95 cm': 10}

这是当前表

我知道如何将dict转换为列和行(键作为列,值作为行,但是我要寻找的是键和值是具有自己的列标题的行)

test = pd.concat([df.drop(['numbers'], axis=1).sort_values(['id']), 
df['numbers'].apply(pd.Series)], axis=1)
test2 = test.melt(id_vars=['id'],
    var_name="name",
    value_name="nameN").fillna(0)

im试图使字典中的每个键和值都成为行

id  name    nameN
1   105 1
1   65  11
1   75  0
1   85  51
1   95  0

1 个答案:

答案 0 :(得分:0)

您应该使用理解能力为新的DataFrame构建数据。如果您可以只删除数字为空字典的id,则可以执行以下操作:

test = pd.DataFrame([[x['id'], k, v] for _, x in df.iterrows()
                 for k,v in x['numbers'].items()], columns=['id', 'name', 'nameN'])

获得:

    id   name  nameN
0    1    105      1
1    1     65     11
2    1     75      0
3    1     85     51
4    1     95      0
5    2    105      1
6    2     65     11
7    2     75      0
8    2     85     50
9    2     95      0
10   3    105      1
11   3     65     11
12   3     75      0
13   3     85     51
14   3     95      0
15   7  75 cm      7
16   7  85 cm     52
17   7  95 cm     10
18   8  75 cm     51
19   8  85 cm    114
20   8  95 cm     10
21   9  75 cm      9
22   9  85 cm     60
23   9  95 cm     10

如果您希望在数字为空时使用特定值的行:

test2 = pd.DataFrame([i for lst in [[[x['id'], '', '']] if x['numbers'] == {}
          else [[x['id'], k, v] for k,v in x['numbers'].items()]
          for _, x in df.iterrows()] for i in lst],
         columns=['id', 'name', 'nameN']).sort_values('id').reset_index(drop=True)

给予:

    id   name nameN
0    1    105     1
1    1     65    11
2    1     75     0
3    1     85    51
4    1     95     0
5    2    105     1
6    2     65    11
7    2     75     0
8    2     85    50
9    2     95     0
10   3     95     0
11   3     75     0
12   3     85    51
13   3    105     1
14   3     65    11
15   4             
16   5             
17   6             
18   7  75 cm     7
19   7  85 cm    52
20   7  95 cm    10
21   8  75 cm    51
22   8  85 cm   114
23   8  95 cm    10
24   9  85 cm    60
25   9  75 cm     9
26   9  95 cm    10