使用Pandas将类似条目组合在一起并合并

时间:2016-05-21 11:51:22

标签: python pandas dataset

我有一组非常大的数据存储在老式数据库中。我想将它们提取为人类可读的格式(YAML或JSON)。这里的主要目标是通过对类似条目进行分组来避免冗余。

我的数据可以这样总结:

raw = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},
       {'a': 1, 'b': 3, 'c': 3, 'd': 4},
       {'a': 1, 'b': 4, 'c': 6, 'd': 4},
       {'a': 2, 'b': 2, 'c': 9, 'd': 9},
       {'a': 2, 'b': 3, 'c': 3, 'd': 4}] 

目标是按列ab进行分组,然后将相似的条目组合在一起:

data = {
 1: {
     '2,3': {c:3, d:4}, 
      4:    {c:3, d:4} 
    }, 
 2: {
      2:    {c:9, d:4}, 
      3:    {c:3, d:4}
    },
}

请注意,密钥23以逗号连接在一起。

最终,我的输出文件将如下所示:

%YAML 1.2
---
1:
   2,3:
      c: 3
      d: 4
   4: 
      c: 6
      d: 4
2:
   2: 
      c: 9
      d: 4
   3:
      c: 3
      d: 4

使用Pandas进行处理并获取data字典会很容易吗?

在一天结束时,我将按如下方式使用它:

data = fetch_data(sql_query, groupby=('a', 'b'), group_similar='c')

1 个答案:

答案 0 :(得分:1)

你可以:

k = ['a', 'b']
result = {i: {} for i in df[k[0]].unique()}
for vals, data in df.set_index(k).groupby(list(df.drop(k, axis=1).columns)):
    for a, df_a in data.groupby(level=k[0]):
        res = df_a.reset_index(k[0], drop=True).to_dict('index')
        keys = ','.join(map(str, tuple(res.keys())))
        result[a].update({keys: list(res.values())[0]})

得到:

{1: 
    {'2,3': {'c': 3, 'd': 4}, 
       '4': {'c': 6, 'd': 4}},
 2: {  '3': {'c': 3, 'd': 4}, 
       '2': {'c': 9, 'd': 9}}
}