将具有不同键的字典列表转换为数据框
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
字典中只剩下一个元素,但是更手动的循环也很容易工作。
如何将字典列表转换为列为 '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
字典中只剩下一个元素,但是更手动的循环也很容易工作。