2016-08-01 101 views
1

我有3个级别的基于3项分组:KEY1,KEY2,KEY3 我希望得到一个列(C1)的总和以下组合:大熊猫由多个列分组时组合键

key1, sum(c1) 
key1, key2, sum(c1) 
key1, key2, key3, sum(c1) 

我得到3个不同的dfs中的总和。 (sum_k1,sum_k1k2,sum_k1k2k3) 我想数据框结合并随即将其转换成JSON如下:

{ 
key1: { 
      sum: x1, 
      key2: { 
        sum: x2, 
        key3: { 
          sum: x3 
         } 
       } 
     } 
} 

我怎么去呢?

回答

1

我不知道这是否是最有效的方式去了解它,但是这是我想出了

import pandas as pd 
import random 

# Prepare the sample dataset 

table = [] 
for i in range(100000): 
    row = {'key1': random.choice('ABC'), 
      'key2': random.choice('KLM'), 
      'key3': random.choice('XYZ'), 
      'val' : random.randint(0,500)} 
    table.append(row) 

df = pd.DataFrame(table) 

# Aggregate the first level 

dict_agg = (df.groupby('key1') 
      .sum() 
      .rename(columns={'val':'sum'}) 
      .to_dict('index')) 

# Convert from numpy.int64 to Python scalar 
for idx, value in dict_agg.items(): 
    dict_agg[idx]['sum'] = int(dict_agg[idx]['sum']) 

# Aggregate the second level 

df_lvl2 = (df.groupby(['key1','key2']) 
      .sum() 
      .rename(columns={'val':'sum'}) 
      .to_dict('index')) 

# Assign the second level aggregation 

for idx, value in df_lvl2.items(): 
    dict_agg[idx[0]][idx[1]] = {'sum': int(value['sum'])} 

# Aggregate the final level 

df_lvl3 = (df.groupby(['key1','key2','key3']) 
      .sum() 
      .rename(columns={'val':'sum'}) 
      .to_dict('index')) 

# Assign the third level aggregation 

for idx, value in df_lvl3.items(): 
    dict_agg[idx[0]][idx[1]][idx[2]] = {'sum': int(value['sum'])} 

最终的结果将是这样的:

{'A': {'K': {'X': {'sum': 929178}, 
    'Y': {'sum': 940925}, 
    'Z': {'sum': 938008}, 
    'sum': 2808111}, 
    'L': {'X': {'sum': 902581}, 
    'Y': {'sum': 953821}, 
    'Z': {'sum': 942942}, 
    'sum': 2799344}, 
    'M': {'X': {'sum': 930117}, 
    'Y': {'sum': 929257}, 
    'Z': {'sum': 910905}, 
    'sum': 2770279}, 
    'sum': 8377734}, 
'B': {'K': {'X': {'sum': 888818}, 
… 

由于这是一个dict,你需要将其转换成JSON,通过做:

import json 
output = json.dumps(dict_agg) 
+0

因为我有多个列进行求和。在总结部分我正在这样做。对于第一级:'df.groupby('key1')['col1']。sum()'。 to_dict('index')失败。 – bashhike

+0

。重命名位失败。 'to_dict('index')'也失败了。 '.to_dict()'虽然工作。 – bashhike

+0

虽然感谢。这有助于。我可以从这工作。 :) – bashhike

0

我用MULT这个的ilevel索引和这个的xs。 获取最低级别的聚合。

lvl3_grp = df.groupby(['key1', 'key2', 'key3'])['col1', 'col2'].sum() 
lvl3_grp = lvl3_grp.reset_index() 
lvl3_grp.set_index(['key1', 'key2', 'key3'], inplace=True) 

res = {} 
for k1 in lvl3_grp.index.levels[0]: 
sums = lvl3_grp.xs(k1).sum() 
lvl2_grp = lvl3_grp.xs(k1).reset_index() 
lvl2_grp.set_index(['key2', 'key3'], inplace=True) 
lvl2_dict = {} 
for k2 in lvl2_grp.index.levels[0]: 
    sums = lvl2_grp.xs(k1).sum() 

在过去的水平.index.levels[0]不会工作作为它的单一指标。我在for循环中使用.index.values作为迭代列表,.loc用于访问这些值。

我会在稍后扩展答案。