Python 按多列分组时组合键

Python 按多列分组时组合键,python,json,pandas,numpy,Python,Json,Pandas,Numpy,基于3个键,我有3个级别的分组:键1、键2、键3 我想得到以下组合的列(c1)的和: key1, sum(c1) key1, key2, sum(c1) key1, key2, key3, sum(c1) 我在3个不同的dfs中得到总数。(求和k1,求和k1k2,求和k1k2k3) 我想组合数据帧,然后将其转换为json,如下所示: { key1: { sum: x1, key2: { sum: x2,

基于3个键,我有3个级别的分组:键1、键2、键3 我想得到以下组合的列(c1)的和:

key1, sum(c1)
key1, key2, sum(c1)
key1, key2, key3, sum(c1)
我在3个不同的dfs中得到总数。(求和k1,求和k1k2,求和k1k2k3) 我想组合数据帧,然后将其转换为json,如下所示:

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

我该怎么做呢?

我不知道这是不是最有效的方法,但这就是我想到的

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)

我对这个使用了多级索引,对这个使用了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]
不会作为其单个索引工作。我使用
.index.values
来访问iterable列表,并在for循环中使用
.loc
来访问值


稍后我将展开答案。

因为我有多个列要求和。在总结部分,我正在这样做。对于第一级:
df.groupby('key1')['col1'].sum()
。命令(“索引”)失败。。重命名位失败。写入('index')的
也会失败<代码>.to_dict()
虽然有效。