【问题标题】:Forming a nested list and calculating the sum of fields形成嵌套列表并计算字段总和
【发布时间】:2021-08-23 18:11:31
【问题描述】:

记录以这种形式存储在数据库中:

clu name a b
q one 7 6
q two 6 9
q five 6 10
e three 8 7
e four 10 4

我正在编写一个函数,它将计算不同 clu 变量(例如 q 和 e)的给定值的总和。也就是说,首先确定 name 的哪些值对应于 e 的值(它们是 3 和 4)。然后是对字典“e_dict”的呼吁,它存储了与不同名称对应的某些值。该函数应确定对于组 e 有必要将“名称”键 3 和 4 的值相加并给出结果。

字典 e_dict 示例:

{'one': {'u_mean': 4.25, 'c_mean': 4.25}, 'three': {'u_mean': 4.5, 'c_mean': 4.5}, 'two': {'u_mean': 4.583333333333334, 'c_mean': 4.583333333333334}, 'four': {'u_mean': 4.5625, 'c_mean': 4.5625}, 'five': {'u_mean': 4.65, 'c_mean': 4.65}}

结果应该是这样的:

 {'e': {'u_mean': 4.531, 'c_mean': 4.531}, 'q': {'u_mean': 4.49443, 'c_mean': 4.49443}}

即字段都是u_mean,求平均值,也相加。

我的函数的完整代码:

def group_names():
    st, c_clus, n_names = [], [], []
    for h in Utilizations.objects.values('clu', 'name', 'a', 'b'):
        st.append((h.get('clu'), h.get('name'), h.get('a'), h.get('b')))
        c_clus.append(h.get('clu'))
        n_names.append(h.get('name'))
    """получение названий"""
    names, clus = [], []
    for nam in n_names:
        if nam not in names:
            names.append(nam)
    for cl in c_clus:
        if cl not in clus:
            clus.append(cl)
    clu, e = {}, {}
    u_load, u_max = {}, {}
    mean_all, u_load_mean, u_max_mean = 0, 0, 0
    for nam in names:
        hs = Utilizations.objects.filter(name=nam)
        o, p = 0, 0
        for h in hs:
            o += h.a
            p += h.b
            u_load[nam] = o / 2 + 1
            u_max[nam] = p / 2 + 1
        u_max_mean = mean(u_max.values())
        u_load_mean = mean(u_load.values())
        mean_all = (u_max_mean + u_load_mean) / 2
        e[nam] = {'u_mean': mean_all, 'c_mean': mean_all}
    for cl in clus:
        for nam in names:
            s = Utilizations.objects.filter(name=nam, clu=cl)
            for h in hs:
                clu[nam] = cl
    return clu

原来是这样分组的:{'one': 'q', 'two': 'q', 'five': 'q', 'three': 'e', 'four': ' e'}

我不知道下一步该怎么做(

【问题讨论】:

  • 你可以使用 pandas 库吗?因为如果是,这将大大简化任务
  • @Andreas 是的,但我以前从未使用过它

标签: python python-3.x list dictionary


【解决方案1】:

我不知道您的原始数据是如何存储的(我不认识“Utilizations.objects.values”),但这里的代码将根据一个简单的列表列表计算这些平均值:


data = [
    ['q','one',7,6],
    ['q','two',7,6],
    ['q','five',7,6],
    ['e','three',7,6],
    ['e','four',7,6]
]

e_dict = {
        'one': {'u_mean': 4.25, 'c_mean': 4.25},
        'three': {'u_mean': 4.5, 'c_mean': 4.5},
        'two': {'u_mean': 4.583333333333334, 'c_mean': 4.583333333333334},
        'four': {'u_mean': 4.5625, 'c_mean': 4.5625},
        'five': {'u_mean': 4.65, 'c_mean': 4.65}
}

def group_names():
    sums = {}
    counts = {}
    for h in data:
        if h[0] not in sums:
            sums[h[0]] = { "u_mean": 0, "c_mean": 0 }
            counts[h[0]] = 0
        for k,v in e_dict[h[1]].items():
            sums[h[0]][k] += v
        counts[h[0]] += 1
    for k,v in sums.items():
        sums[k]['u_mean'] /= counts[k]
        sums[k]['c_mean'] /= counts[k]
    return sums

print(group_names())

输出:

{'q': {'u_mean': 4.4944444444444445, 'c_mean': 4.4944444444444445}, 'e': {'u_mean': 4.53125, 'c_mean': 4.53125}}

【讨论】:

  • 知道了!谢谢!
【解决方案2】:

您可以为此使用 pandas:

输入:

data = {'clu': {0: 'q', 1: 'q', 2: 'q', 3: 'e', 4: 'e'}, 'name': {0: 'one', 1: 'two', 2: 'five', 3: 'three', 4: 'four'}, 'a': {0: 7, 1: 6, 2: 6, 3: 8, 4: 10}, 'b': {0: 6, 1: 9, 2: 10, 3: 7, 4: 4}}
e_dict = {'one': {'u_mean': 4.25, 'c_mean': 4.25}, 'three': {'u_mean': 4.5, 'c_mean': 4.5}, 'two': {'u_mean': 4.583333333333334, 'c_mean': 4.583333333333334}, 'four': {'u_mean': 4.5625, 'c_mean': 4.5625}, 'five': {'u_mean': 4.65, 'c_mean': 4.65}}

代码:

import pandas as pd
df = pd.DataFrame(data)
df_e = pd.DataFrame(e_dict).T.rename_axis('name').reset_index()

df = df.merge(df_e, on=['name'])
df = df.groupby(['clu']).agg({'u_mean':'mean', 'c_mean':'mean'})
df.to_dict(orient='index')

输出:

{'e': {'u_mean': 4.53125, 'c_mean': 4.53125},
 'q': {'u_mean': 4.4944444444444445, 'c_mean': 4.4944444444444445}}

说明:

Pandas 允许以表格形式处理数据,类似于您在示例中显示的数据。 第一个表 (DataFrame) 是 df,第二个是包含查找值 (e_dict) 但经过一些预处理(转置和重命名的列)的表。

然后我们根据它们的名称值合并两个表,这样你就有了第一个表中对应的 u_mean 和 c_mean 值。

现在我们按clue 值对值进行分组,并用mean 聚合这些值。

最后我们将表作为字典返回。

【讨论】:

  • @lodo_dev,很高兴我能帮上忙。请考虑支持并接受解决您问题的答案。这样,未来的读者可以更快地找到答案,其他人会看到这个问题已得到回答并且不再开放,并且答案的作者(和您)会得到一些分数。
  • @lodo_dev,啊,我明白了。你应该很快就会拥有它。但是,接受答案应该没有任何声誉。编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
相关资源
最近更新 更多