2017-04-02 3 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))) 

私が試した櫛のstmtと複数のバリエーションは、単に辞書を印刷しています。 2つのバリエーションを2つ試してテストしますが、動作しません。これはリストの値の数に基づいて調整する必要があります。

私はデータセットを持ち込み、すべての組み合わせを別のテーブルに作成するために、各グループとqtyのリストを持つ辞書を作成することが最善であると考えていました。各値の組み合わせと合計を取得すると、合計とフラグと比較するメインデータフレームにリンクし直します。

私は、グループに関連付けられた数量と集計のそれぞれの組み合わせを作成する際に問題が発生しています。すべての辞書のリストに保存されていれば実行できますが、グループごとにグループ化する必要があります。たとえば、グループ1には1000,8000と1000,13000と1000,1000と1000,8000,13000などが必要です。組み合わせの量は、グループによって異なります。

誰かが正しい方向に私を導くのを助けることができますか?多分私の思考は、これについてどうやって行くのかというだけではありません。

はここであなたに

+0

私はあなたの要件を理解していません。たとえば、1000,13000、および1000が10000〜11000の範囲内にあるのはなぜですか。 –

+0

彼らは一人で見たときではありません - 私はそのグループ内の数量または数量の組み合わせがその範囲内にあるかどうかを調べようとしています。そのグループでは、1000,8000と1000はその範囲内で合計されるため、識別する必要があります。 – Court

答えて

1

ありがとうもリスト内包と一緒にitertools.combinationを使用して1つの自己説明的なソリューションです:

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

関連する問題