pandas.DataFrame,列中包含类似dict的数据

时间:2018-07-23 14:30:08

标签: python pandas

使用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'

但是再说一次,什么是通用的解决方案,使我能够

  • groupby等于 meta
  • 在每个 meta 对象中具有不同的属性,即没有直接方法将它们强制转换为单独的DataFrame列
  • 轻松访问和过滤 meta data 中的各个标量

我考虑过将这些列显式转换为collections.namedtuple。至少这解决了使用字典的哈希性问题。但是在加载时对每一行执行此操作似乎非常昂贵。另外,仍然无法像使用真正的DataFrame列那样过滤数据-我仍然希望能够做到

subset = data[data.meta.name == "test_xyz"]

是否有一般的配方如何将pandas用于这种动态长度列/ 3D数据?

0 个答案:

没有答案