python - Pandas - 字典列表的列扩展 - 如何优化?
问题描述
我有一个test
包含 3 列id, name, value
的数据框以下列test['values']
。外观示例test
如下:
name values
0 impressions [{'value': 17686, 'end_time': '2018-06-12T07:0...
1 reach [{'value': 6294, 'end_time': '2018-06-12T07:00...
2 follower_count [{'value': 130, 'end_time': '2018-06-12T07:00:...
3 email_contacts [{'value': 1, 'end_time': '2018-06-12T07:00:00...
4 phone_call_clicks [{'value': 0, 'end_time': '2018-06-12T07:00:00...
5 text_message_clicks [{'value': 0, 'end_time': '2018-06-12T07:00:00...
6 get_directions_clicks [{'value': 0, 'end_time': '2018-06
测试值单元格如下所示:
[{'end_time': '2018-06-12T07:00:00+0000', 'value': 17686},
{'end_time': '2018-06-13T07:00:00+0000', 'value': 4064}]
我可以通过执行以下操作来扩展它:
test[['Values 1', 'Values 2']] = test['values'].apply(pd.Series)
test[['Date 1', 'Values 1']] = test['Values 1'].apply(pd.Series)
test[['Date 2', 'Values 2']] = test['Values 2'].apply(pd.Series)
test.drop(['values'], axis=1, inplace=True)
结果是这样的:
id name Values 1 Values 2 Date 1 Date 2
/insights/impressions/day impressions 17686 4064 2018-06-12T07:00:00+0000 2018-06-13T07:00:00+0000
/insights/reach/day reach 6294 2085 2018-06-12T07:00:00+0000 2018-06-13T07:00:00+0000
/insights/follower_count/day follower_count 130 37 2018-06-12T07:00:00+0000 2018-06-13T07:00:00+0000
我想知道是否:
一种。有一种更快的方法来扩展字典列表
湾。有一种方法可以取消透视数据,以便值 1 和值 2 在一个列上。日期 1 和日期 2 在另一列
解决方案
如果输入数据是 jsons,最好使用json_normalize
.
j = [{'description': 'Total number 1', 'id': 'a', 'name': 'impressions', 'period': 'day', 'title': 'Impressions', 'values': [{'end_time': '2018-06-12T07:00:00+0000', 'value': 17686}, {'end_time': '2018-06-13T07:00:00+0000', 'value': 4064}]},
{'description': 'fn', 'id': 'b', 'name': 'impressions', 'period': 'day', 'title': 'Impressions', 'values': [{'end_time': '2018-06-12T07:00:00+0000', 'value': 17686}, {'end_time': '2018-06-13T07:00:00+0000', 'value': 4064}]}]
from pandas.io.json import json_normalize
df = json_normalize(j, 'values')
print (df)
end_time value
0 2018-06-12T07:00:00+0000 17686
1 2018-06-13T07:00:00+0000 4064
2 2018-06-12T07:00:00+0000 17686
3 2018-06-13T07:00:00+0000 4064
但如果需要还添加原始列:
from pandas.io.json import json_normalize
df = json_normalize(j, 'values', ['description', 'id', 'name', 'period', 'title'])
print (df)
end_time value description id name period \
0 2018-06-12T07:00:00+0000 17686 Total number 1 a impressions day
1 2018-06-13T07:00:00+0000 4064 Total number 1 a impressions day
2 2018-06-12T07:00:00+0000 17686 fn b impressions day
3 2018-06-13T07:00:00+0000 4064 fn b impressions day
title
0 Impressions
1 Impressions
2 Impressions
3 Impressions
第一个解决方案:
test = pd.DataFrame({
'name':['a', 'b', 'n'],
'values':[[{'end_time': '2018-06-12T07:00:00+0000', 'value': 17686},
{'end_time': '2018-06-13T07:00:00+0000', 'value': 4064}],[{'end_time': '2018-06-12T07:00:00+0000', 'value': 17686},
{'end_time': '2018-06-13T07:00:00+0000', 'value': 4064}],[{'end_time': '2018-06-12T07:00:00+0000', 'value': 17686},
{'end_time': '2018-06-13T07:00:00+0000', 'value': 4064}]]
})
df = (pd.concat([pd.DataFrame(x) for x in test['values']], axis=1, keys=(1, 2))
.stack(0)
.reset_index(level=1, drop=True))
print (df)
end_time value
0 2018-06-12T07:00:00+0000 17686
0 2018-06-12T07:00:00+0000 17686
1 2018-06-13T07:00:00+0000 4064
1 2018-06-13T07:00:00+0000 4064
df = test.join(df)
print (df)
name values \
0 a [{'end_time': '2018-06-12T07:00:00+0000', 'val...
0 a [{'end_time': '2018-06-12T07:00:00+0000', 'val...
1 b [{'end_time': '2018-06-12T07:00:00+0000', 'val...
1 b [{'end_time': '2018-06-12T07:00:00+0000', 'val...
2 n [{'end_time': '2018-06-12T07:00:00+0000', 'val...
end_time value
0 2018-06-12T07:00:00+0000 17686.0
0 2018-06-12T07:00:00+0000 17686.0
1 2018-06-13T07:00:00+0000 4064.0
1 2018-06-13T07:00:00+0000 4064.0
2 NaN NaN
推荐阅读
- android - React-native 项目构建失败:找不到 com.android.tools.lint,无法确定任务“:app:lintVitalRelease”的依赖关系
- html - 如何停止幻灯片在滚动时移动
- powershell - 使用多行命令运行 Docker 的 Windows 10 Powershell 出现错误
- c++-cli - “= gcnew MyClass()”和“= %MyClass()”有什么区别?
- excel - 返回多行/多列值的 Excel 函数
- python - 无法从 Scrapy Spider 导出数据,start_url 未定义
- powershell - 重命名批量 JPG 图像和格式 - PowerShell
- javascript - 执行命令后没有记录到控制台
- javascript - Firebase 数据库触发器 - 如何等待调用
- python-3.x - 找出散点图中最密集区域的中心