Python 3 - 在字典和聚合

时间:2017-04-02 17:38:08

标签: python pandas dictionary combinations

我想我会在大熊猫中以一种倒退的方式解决这个问题。这是一个示例数据框:

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)))

我试过的梳理和多种变化只是打印字典。将2用于两个变体以测试它但不工作 - 这必须根据列表中的#值进行调整。

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

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

任何人都可以协助指导我朝着正确的方向前进吗?也许我的想法是关于如何解决这个问题。

谢谢

1 个答案:

答案 0 :(得分: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