将具有不同键的字典列表转换为数据帧

时间:2015-01-21 17:01:41

标签: python pandas

如何获取转换为列为'Event', 'Id', 'Name'的数据帧的词典列表?

sample = [{'event': 'up', '53118': 'Harry'},
                  {'event': 'up', '51880': 'Smith'}, 
                  {'event': 'down', '51659': 'Joe'}, 
                  {'52983': 'Sam', 'event': 'up'}, 
                  {'event': 'down', '52917': 'Roger'},
                  {'event': 'up', '314615': 'Julie'},
                  {'event': 'left', '276298': 'Andrew'},
                  {'event': 'right', '457249': 'Carlos'}, 
                  {'event': 'down', '391485': 'Jason'},
                  {'event': 'right', '53191': 'Taylor'}, 
                  {'51248': 'Benjy', 'event': 'down'}]

pd.DataFrame(sample)会返回;

enter image description here

是否有一种pythonic panda-ic方式将其转换为此形式?

Event   Id      Name
up     53118    Harry
up     51880    Smith
down   51659    Joe

2 个答案:

答案 0 :(得分:4)

pd.melt可以帮助您完成任务,从df = pd.DataFrame(sample)

开始
In [74]: m = pd.melt(df, id_vars="event", var_name="Id", value_name="Name").dropna()

In [75]: m
Out[75]: 
     event      Id    Name
6     left  276298  Andrew
16      up  314615   Julie
30    down  391485   Jason
40   right  457249  Carlos
54    down   51248   Benjy
57    down   51659     Joe
67      up   51880   Smith
81    down   52917   Roger
91      up   52983     Sam
99      up   53118   Harry
119  right   53191  Taylor

然后你可以进行一些清理(reset_index(drop=True)rename(columns={"event": "Event"}),将Id转换为整数等。)

由于@eumiro提出了一个很好的观点,我们也可以很容易地实现@MattDMo的建议:

In [90]: sample = [dict(event=d.pop("event"), id=min(d), name=min(d.values())) for d in sample]

In [91]: pd.DataFrame(sample)
Out[91]: 
    event      id    name
0      up   53118   Harry
1      up   51880   Smith
2    down   51659     Joe
3      up   52983     Sam
4    down   52917   Roger
5      up  314615   Julie
6    left  276298  Andrew
7   right  457249  Carlos
8    down  391485   Jason
9   right   53191  Taylor
10   down   51248   Benjy

在这里,我充分利用了这样一个事实:一旦我们弹出event,字典中只剩下一个元素,但更简单的手动循环就可以了。

答案 1 :(得分:1)

你需要调整你的dicts,这样就不用了:

{'event': 'up', '53118': 'Harry'}
你有:

{'event': 'up', 'id': '53118', 'name': 'Harry'}

导致:

In [23]: df = pd.DataFrame(sample)

In [24]: df
Out[24]: 
    event      id    name
0      up   53118   Harry
1      up   51880   Smith
2    down   51659     Joe
3      up   52983     Sam
4    down   52917   Roger
5      up  314615   Julie
6    left  276298  Andrew
7   right  457249  Carlos
8    down  391485   Jason
9   right   53191  Taylor
10   down   51248   Benjy