使用pandas
,我试图提高处理某些日志数据的性能,这些数据以前是我自己在Python列表中完成的,最终随着数据量的增加而变得非常慢。
数据以json文件形式出现,如下例所示。它是一个 event 数组,其中每个事件都是一个对象,并具有一个时间戳,一个 type 名称和一些 data 和元信息:
[
{
"timestamp": 1532334284.943328,
"type": "TEST_RESULT",
"meta": {"name": "test_xyz", "param": 1.5},
"data": {"value": 100.0, "success": true},
},
{
"timestamp": 1532334285.943328,
"type": "TEST_RESULT",
"meta": {"name": "test_xyz", "param": 2.0},
"data": {"value": 200.0, "success": true},
},
{
"timestamp": 1532334286.943328,
"type": "TEST_RESULT",
"meta": {"name": "test_xyz", "param": 1.5},
"data": {"value": 300.0, "success": false},
}
]
首先,我使用pd.read_json
将数据放入pandas.DataFrame
中,结果是:
In [50]:data
Out[50]:
data meta \
0 {'value': 100.0, 'success': True} {'name': 'test_xyz', 'param': 1.5}
1 {'value': 200.0, 'success': True} {'name': 'test_xyz', 'param': 2.0}
2 {'value': 300.0, 'success': False} {'name': 'test_xyz', 'param': 1.5}
timestamp type
0 1.532334e+09 TEST_RESULT
1 1.532334e+09 TEST_RESULT
2 1.532334e+09 TEST_RESULT
在对 type 字段进行过滤/分组时,问题是我无法找出对 meta 和中的内容执行相同操作的方法数据词典。例如:
data.groupby(data.meta).all()
导致一个空的DataFrame,我希望看到2个不同的行,因为meta列中有2个不同(唯一)的对象。我认为这与对象(不可散列)字典有关,这就是为什么
data.meta.unique()
导致
TypeError:不可散列的类型:'dict'
但是再说一次,什么是通用的解决方案,使我能够
我考虑过将这些列显式转换为collections.namedtuple
。至少这解决了使用字典的哈希性问题。但是在加载时对每一行执行此操作似乎非常昂贵。另外,仍然无法像使用真正的DataFrame列那样过滤数据-我仍然希望能够做到
subset = data[data.meta.name == "test_xyz"]
是否有一般的配方如何将pandas
用于这种动态长度列/ 3D数据?