我有3个级别的分组,基于3个键:key1,key2,key3 我想获得以下组合的列(c1)的总和:
{
key1: {
sum: x1,
key2: {
sum: x2,
key3: {
sum: x3
}
}
}
}
我得到了3种不同dfs的总和。 (sum_k1,sum_k1k2,sum_k1k2k3) 我想组合数据帧,然后按如下方式将其转换为json:
public static List<string> GetTokens(this string line)
{
return Regex.Matches(line,
@""".*?""|\S+").Cast<Match>().Select(m => m.Value).ToList();
}
我该怎么做?
答案 0 :(得分: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)
答案 1 :(得分:0)
我为此使用了多级索引,为此使用了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
用于可迭代列表,并在for循环中使用.loc
来访问值。
我稍后会扩大答案。