2017-02-28 20 views
0

各日付に対して列Quantileを作成したいとします。一意の値ごとのQuantileを計算します。Sales value。 「カテゴリ」は常に、それぞれの特定の日付の売上の同じ数字に対応します。Quantile関数を使用してpandas quantileで新しい列を作成する

私は日付で索引付けされたデータフレームを持っています。多くの日付と同じ日付の複数があります。 1日のDFのサブセットの例:

  Category Sales Ratio 1 Ratio 2 
11/19/2016 Bar  300  0.46 0.96 
11/19/2016 Bar  300  0.56 0.78 
11/19/2016 Bar  300  0.43 0.96 
11/19/2016 Bar  300  0.47 0.94 
11/19/2016 Casino 550  0.92 0.12 
11/19/2016 Casino 550  0.43 0.74 
11/19/2016 Casino 550  0.98 0.65 
11/19/2016 Casino 550  0.76 0.67 
11/19/2016 Casino 550  0.79 0.80 
11/19/2016 Casino 550  0.90 0.91 
11/19/2016 Casino 550  0.89 0.31 
11/19/2016 Café 700  0.69 0.99 
11/19/2016 Café 700  0.07 0.18 
11/19/2016 Café 700  0.75 0.59 
11/19/2016 Café 700  0.07 0.64 
11/19/2016 Café 700  0.14 0.42 
11/19/2016 Café 700  0.30 0.67 
11/19/2016 Pub  250  0.64 0.09 
11/19/2016 Pub  250  0.93 0.37 
11/19/2016 Pub  250  0.69 0.42 

私は日付ごとのユニークなセールスの0.5分位数を計算分位と呼ばれる新しい列を追加するコードをしたいです。注目すべき重要な点は、特定の日付のカテゴリでは、Salesは常に同じです(日付が変わると物事が変わります)。

解決策の例:df ['Quantile'] = df.Sales.groupby(df.index).transform(ラムダx:x.quantile(q = 0.5、軸= 0、補間= '中点') )

しかし、これは(それが働いていても)十分ではありません。この例では(この1つの日付の場合)、新しい列df ['Quantile']では、すべての値が不完全な日付で同じになります。

この日付では、計算では分位数に300,550,700、および250が使用されます。

したがって、最終的なDFは次のようになります。

 Category Sales Ratio 1 Ratio 2  Quantile 
11/19/2016 Bar  300  0.46 0.96  425 
11/19/2016 Bar  300  0.56 0.78  425 
11/19/2016 Bar  300  0.43 0.96  425 
11/19/2016 Bar  300  0.47 0.94  425 
11/19/2016 Casino 550  0.92 0.12  425 
11/19/2016 Casino 550  0.43 0.74  425 
11/19/2016 Casino 550  0.98 0.65  425 
11/19/2016 Casino 550  0.76 0.67  425 
11/19/2016 Casino 550  0.79 0.80  425 
11/19/2016 Casino 550  0.90 0.91  425 
11/19/2016 Casino 550  0.89 0.31  425 
11/19/2016 Café 700  0.69 0.99  425 
11/19/2016 Café 700  0.07 0.18  425 
11/19/2016 Café 700  0.75 0.59  425 
11/19/2016 Café 700  0.07 0.64  425 
11/19/2016 Café 700  0.14 0.42  425 
11/19/2016 Café 700  0.30 0.67  425 
11/19/2016 Pub  250  0.64 0.09  425 
11/19/2016 Pub  250  0.93 0.37  425 
11/19/2016 Pub  250  0.69 0.42  425 

私は、各カテゴリの唯一の要素を見ずに、特定の日付のすべての販売の分位を行うことだった場合、私は550のようなものになるだろう(これは欲しくない)。

重要なことは、コードをシンプルで合理的に(日付がかなり大きいので)したいと思います。補間もまた中間点でなければならない。

答えて

1

あなたがdrop_duplicatesを必要とするようだ:

df['Quantile'] = df.Sales.groupby(df.index) 
        .transform(lambda x: x.drop_duplicates().quantile()) 
print (df) 
      Category Sales Ratio 1 Ratio 2 Quantile 
11/19/2016  Bar 300  0.46  0.96  425 
11/19/2016  Bar 300  0.56  0.78  425 
11/19/2016  Bar 300  0.43  0.96  425 
11/19/2016  Bar 300  0.47  0.94  425 
11/19/2016 Casino 550  0.92  0.12  425 
11/19/2016 Casino 550  0.43  0.74  425 
11/19/2016 Casino 550  0.98  0.65  425 
11/19/2016 Casino 550  0.76  0.67  425 
11/19/2016 Casino 550  0.79  0.80  425 
11/19/2016 Casino 550  0.90  0.91  425 
11/19/2016 Casino 550  0.89  0.31  425 
11/19/2016  Cafe 700  0.69  0.99  425 
11/19/2016  Cafe 700  0.07  0.18  425 
11/19/2016  Cafe 700  0.75  0.59  425 
11/19/2016  Cafe 700  0.07  0.64  425 
11/19/2016  Cafe 700  0.14  0.42  425 
11/19/2016  Cafe 700  0.30  0.67  425 
11/19/2016  Pub 250  0.64  0.09  425 
11/19/2016  Pub 250  0.93  0.37  425 
11/19/2016  Pub 250  0.69  0.42  425 

df['Quantile'] = df.Sales.groupby(df.index) 
        .transform(lambda x: np.percentile(x.unique(), 50)) 
print (df) 
      Category Sales Ratio 1 Ratio 2 Quantile 
11/19/2016  Bar 300  0.46  0.96  425 
11/19/2016  Bar 300  0.56  0.78  425 
11/19/2016  Bar 300  0.43  0.96  425 
11/19/2016  Bar 300  0.47  0.94  425 
11/19/2016 Casino 550  0.92  0.12  425 
11/19/2016 Casino 550  0.43  0.74  425 
11/19/2016 Casino 550  0.98  0.65  425 
11/19/2016 Casino 550  0.76  0.67  425 
11/19/2016 Casino 550  0.79  0.80  425 
11/19/2016 Casino 550  0.90  0.91  425 
11/19/2016 Casino 550  0.89  0.31  425 
11/19/2016  Cafe 700  0.69  0.99  425 
11/19/2016  Cafe 700  0.07  0.18  425 
11/19/2016  Cafe 700  0.75  0.59  425 
11/19/2016  Cafe 700  0.07  0.64  425 
11/19/2016  Cafe 700  0.14  0.42  425 
11/19/2016  Cafe 700  0.30  0.67  425 
11/19/2016  Pub 250  0.64  0.09  425 
11/19/2016  Pub 250  0.93  0.37  425 
11/19/2016  Pub 250  0.69  0.42  425 
+0

のみ、特定の日付のカテゴリの重複を削除するには、引数を追加する方法はありますか?同じ販売価値を持つカテゴリがある可能性がありますか?つまり、日付ごとに各カテゴリーごとに1つの売上値のみを量子化しますか? – MysterioProgrammer91

+0

要件に合わせてサンプルを変更できますか? df1 = df [df.duplicated(サブセット= ['Category'、 'Sales'])&(df.index.isin(['11-19-2016'、 '11-20 -2016 ']))] 'を実行し、quantileを適用しますか? – jezrael

+0

素晴らしい感謝 – MysterioProgrammer91

関連する問題