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

Convert a list of dictionaries with varying keys to a dataframe

如何将字典列表转换为列为 '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) 会 return;

有没有pythonic panda-ic的方法可以把它转换成这种形式?

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

你需要调整你的听写,这样就不会:

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

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

这里我利用了这样一个事实,即一旦我们 pop event 字典中只剩下一个元素,但是更手动的循环也很容易工作。