2017-02-28 25 views
0

我想爲每個日期創建一列Quantile。計算每個唯一值銷售額的分位數。即,類別始終對應於每個特定日期的相同銷售數量。使用分位數函數在熊貓分位數中創建新列

我有按日期編制索引的數據框。有許多日期和多個相同的日期。 DF的子集1天的例子:

  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分位數獨特的銷售。關鍵要注意的是,對於特定日期的某個類別,銷售總是相同的(事情隨日期變化而變化)。解決方案示例:df ['Quantile'] = df.Sales.groupby(df.index).transform(lambda x:x.quantile(q = 0.5,axis = 0,interpolation ='midpoint')) )

然而,這還不夠(即使它工作)。對於這個例子(對於這個日期),在新列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

有沒有辦法來添加參數僅下降類別的副本特定日期?因爲可能有類別具有相同的銷售價值?即每個日期只對每個類別分位一個銷售價值? – MysterioProgrammer91

+0

您可以根據您的要求更改樣品嗎?你需要'先過濾'如'df1 = df [df.duplicated(subset = ['Category','Sales'])&(df.index.isin(['11-19-2016','11-20 -2016']))]'然後應用分位數? – jezrael

+0

非常感謝 – MysterioProgrammer91