2016-08-01 90 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用於訪問這些值。

我會在稍後擴展答案。