2017-04-02 95 views
0

我想我在熊貓中以倒退的方式討論這一切。下面是一個例子數據框:Python 3 - 在字典和聚合中創建列表的組合

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等等。組合的數量可能因組而異。

任何人都可以協助指導我在正確的方向嗎?也許我的想法是關於如何去做這件事。

謝謝

+0

我不明白你的要求。例如,爲什麼1000-13000,1000的範圍是10000-11000? –

+0

他們不是單獨看時 - 我試圖弄清楚該組中的數量或數量組合是否在該範圍內。在該組中,應該確定1000,8000和1000,因爲它們的總和在該範圍內。 – Court

回答

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

+0

非常感謝您的光臨。我將通過你的解決方案來確保我理解所有的東西等等。我只是寫了一個例子,說明需要爲組1創建的組合。邏輯輸出是正確的。 – Court