【问题标题】:Python 3 - create combination of list within dictionary and aggregatePython 3 - 在字典和聚合中创建列表组合
【发布时间】:2017-04-02 17:38:08
【问题描述】:

我想我在 pandas 中以一种倒退的方式来处理这一切。这是一个示例数据框:

Group rstart rend  qty
1     10000  11000 1000
1     10000  11000 8000
1     10000  11000 13000
1     10000  11000 1000
2     6000   8000  4000
2     6000   8000  9000
2     6000   8000  3000

最后,我试图确定组内介于范围之间的数量或数量组合,并将标志放在新列中(如果可能的话,也将组合保存在新列中)。

这是我到目前为止所做的以及我遇到问题的地方 - 自从我不熟悉这种语言以来,我一直在尝试各种不同的方式。

import pandas as pd
import numpy as np
import itertools

df = pd.read_csv('test.csv')
d = df[['group','qty']]
s = d.groupby('group')['qty'].apply(list).to_dict()
comb = list(map(dict,itertools.combinations(s.items(),2)))

我尝试的comb stmt 和多种变体只是打印字典。将 2 用于两个变体以对其进行测试但不起作用 - 这必须根据列表中值的数量进行调整。

我引入了数据集,然后想最好为每个分组和数量创建一个包含列表的字典,以便在单独的表中创建所有组合。一旦我有了每个值的组合和总和 - 链接回主数据框以与总数和标志进行比较。

我在创建与组关​​联的数量的每个组合并求和时遇到了问题。如果存储在所有字典的列表中,我可以执行它,但我需要按组分组。例如,第 1 组应该有 1000,8000 和 1000,13000 和 1000,1000 和 1000,8000,13000 等等。组合的数量可能因组而异。

任何人都可以帮助指导我正确的方向吗?也许我的想法是关于如何去做。

谢谢

【问题讨论】:

  • 我不明白你的要求。比如为什么1000、13000、1000在10000-11000范围内?
  • 单独看时它们不是 - 我试图弄清楚该组内的数量或数量组合是否在该范围内。在该组中,应确定 1000,8000 和 1000,因为它们的总和在该范围内。

标签: python pandas dictionary combinations


【解决方案1】:

这是一个自我解释的解决方案,它也将itertools.combination 与列表推导结合使用:

def aggregate(sub_df):
    # get boundaries and actual values 
    bound_low = sub_df["rstart"].iloc[0]
    bound_high = sub_df["rend"].iloc[0]
    values = sub_df["qty"].values

    # get possible combinations, iterate all lengths of combinations
    combis = [itertools.combinations(values, x+1)
              for x in range(len(values))]

    # flatten all combis and apply filter condition
    result = [combi for sub_combi in combis 
              for combi in sub_combi 
              if bound_low <= sum(combi) <= bound_high]

    return result

print(df.groupby("Group").apply(aggregate))

Group
1    [(1000, 8000, 1000)]
2          [(4000, 3000)]
dtype: object

但是,这里的group 1 should have 1000,8000 and 1000,13000 and 1000,1000 and 1000,8000,13000我听不懂。

【讨论】:

  • 非常感谢潘森。我将仔细阅读您的解决方案,以确保我理解所有内容等我刚刚写了一个示例,展示了需要为第 1 组创建的组合的示例。您的逻辑输出是正确的。
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多