2017-03-27 7 views
1

これは説明するのが少し難しいので、私と一緒にお願いします。複数の列をグループ化して、python pandasデータフレームをフィルタリングしてください

は、私は

私は5行があり

  1. 以下の基準に合致する新しいデータフレームを作成することができ、行ごとに、なりますどのように

    enter image description here

    以下のように、テーブルを持っていると仮定します列Aの値は、最初の行が(200,311)の間にあり、2番目の行が(312,370)の間などであることを示します。

  2. Has (1,16)、第2列(17,50)などの範囲の間の列Bからの値となる。

  3. 各セルの値は、対応する列と行に一致する列Cの値の合計になります。

例:

enter image description here

任意図?数字はランダムで、私の例に従う必要はありません。

ありがとうございます!


私の解決策は、新しいデータフレームに各セルの値を埋めるために埋め込まれたループを実行し、二つのリストに事前定義列基準および列基準でした。これは動作していますが、遅くはありませんが、これはpandasデータフレームであるため、私は疑問に思っています。

もう一度おねがいします!

あなたの範囲を得るために cutを使用して、合計を取得するために pivot_tableにそれらを供給することができ

答えて

3

# Setup example data. 
np.random.seed([3, 1415]) 
n = 100 
df = pd.DataFrame({ 
    'A': np.random.randint(200, 601, size=n), 
    'B': np.random.randint(1, 101, size=n), 
    'C': np.random.randint(25, size=n) 
    }) 

# Use cut to get the ranges. 
a_bins = pd.cut(df['A'], bins=[200, 311, 370, 450, 550, 600], include_lowest=True) 
b_bins = pd.cut(df['B'], bins=[1, 16, 67, 100], include_lowest=True) 

# Pivot to get the sums. 
df2 = df.pivot_table(index=a_bins, columns=b_bins, values='C', aggfunc='sum', fill_value=0) 

結果の出力:

B   [1, 16] (16, 67] (67, 100] 
A          
[200, 311]  82  118  153 
(311, 370]  68  56   45 
(370, 450]  41  129   40 
(450, 550]  32  121   57 
(550, 600]  0  112   47 
+0

私は特定の数にちょうど等しい間隔を持っているので、どのような場合は、ありがとう:ここpd.crosstabメソッドを使用してわずかに変更されたワンライナーのバージョンは、ありますか?ある範囲の代わりに、c = 333と言ってください。どのように私はビンでこれを定義するのですか? – Windtalker

+0

整数値しかないと仮定すると、長さ1のビンを定義できます。 'pd_cut'では' bins = [...、332、333、...] 'を使い、最初のバケットの場合は' include_lowest = True'を省略します。これはあなたに '(332、333')を与えます。これは333ではなく333を含みます。しかし、これは '332.8が'(332、333) 'に含まれているので、 – root

+0

ああ、私の悪いこのような簡単な質問...ありがとうございました! – Windtalker

1

を私は本当に@root's solutionのような!

In [102]: pd.crosstab(
    ...:  pd.cut(df['A'], bins=[200, 311, 370, 450, 550, 600], include_lowest=True), 
    ...:  pd.cut(df['B'], bins=[1, 16, 67, 100], include_lowest=True), 
    ...:  df['C'], 
    ...:  aggfunc='sum' 
    ...:) 
    ...: 
Out[102]: 
B   [1, 16] (16, 67] (67, 100] 
A 
[200, 311]  31  157  117 
(311, 370]  23  90   38 
(370, 450]  110  168   60 
(450, 550]  37  117  115 
(550, 600]  35  19   49 
+0

ありがとう、どうして特定の数字に等しい間隔があるのですか?c = 333の代わりに範囲を指定します。これをビンにどのように定義しますか? – Windtalker

+0

@Windtalkerは、ビンを生成するために 'np.arange'または' np.linspace'を使用します。 – MaxU

+0

私はもう一度感謝します! – Windtalker

関連する問題