2017-09-21 136 views
0

我有一個分組的熊貓groupby對象。熊貓羣組操作列

dis type id date   qty 
1 1 10 2017-01-01 1 
1 1 10 2017-01-01 0 
1 1 10 2017-01-02 4.5 
1 2 11 2017-04-03 1 
1 2 11 2017-04-03 2 
1 2 11 2017-04-03 0 
1 2 11 2017-04-05 0 

我想對這個groupby對象應用一些操作。

  1. 我想添加一個新列total_order計算在特定日期的特定材料
  2. A柱zero_qty計​​算的零個訂單數特定日期的特定材料
  3. 的訂單數
  4. 更改日期列以使其計算特定物料的每個後續訂單之間的天數。一階變爲0

最終的數據幀想是這樣的:

dis type id date qty total_order zero_qty 
1 1 10 0 1 2   1 
1 1 10 0 0 2   1 
1 1 10 1 4.5 1   1 
1 2 11 0 1 3   2 
1 2 11 0 2 3   2 
1 2 11 0 0 3   2 
1 2 11 2 0 1   1 
+0

秀我們是你迄今爲止所嘗試過的。 –

+0

歡迎來到Stack Overflow。你已經嘗試過這麼做了什麼?請回顧[預計需要多少研究工作?](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users)。堆棧溢出不是一種編碼服務。預計您會在發佈之前研究您的問題,並嘗試親自編寫代碼***。如果您遇到* specific *,請返回幷包含[Minimal,Complete和Verifiable示例](https://stackoverflow.com/help/mcve)以及您嘗試的內容摘要,以便我們提供幫助。 – FluffyKitten

+0

我只針對dis,type和id對數據幀進行了分組,並且我被groupbyobject卡住了。 我無法在不應用任何聚合函數的情況下將groupby對象轉換爲數據框。之前,我正在爲特定日期彙總數量字段以獲取已過去的天數。但我無法弄清楚如何做到這一點,保持我的領域完好無損,只需添加列來獲得所需的輸出 –

回答

1

我認爲你需要transform團體的數量大小total_order,再算上在qty和最後一個零的個數獲得通過diff差異與fillnadays

通知 - 差價需要排序的列,sort_values做,如果有必要:

df = df.sort_values(['dis','type','id','date']) 

g = df.groupby(['dis','type','id','date']) 
df['total_order'] = g['id'].transform('size') 
df['zero_qty'] = g['qty'].transform(lambda x: (x == 0).sum()).astype(int) 
df['date'] = df.groupby(['dis','type','id'])['date'].diff().fillna(0).dt.days 
print (df) 
    dis type id date qty total_order zero_qty 
0 1  1 10  0 1.0   2   1 
1 1  1 10  0 0.0   2   1 
2 1  1 10  1 4.5   1   0 
3 1  2 11  0 1.0   3   1 
4 1  2 11  0 2.0   3   1 
5 1  2 11  0 0.0   3   1 
6 1  2 11  2 0.0   1   1 

另一種解決方案,而不是多個transform使用apply自定義功能:

df = df.sort_values(['dis','type','id','date']) 

def f(x): 
    x['total_order'] = len(x) 
    x['zero_qty'] = x['qty'].eq(0).sum().astype(int) 
    return x 

df = df.groupby(['dis','type','id','date']).apply(f) 

df['date'] = df.groupby(['dis','type','id'])['date'].diff().fillna(0).dt.days 
print (df) 
    dis type id date qty total_order zero_qty 
0 1  1 10  0 1.0   2   1 
1 1  1 10  0 0.0   2   1 
2 1  1 10  1 4.5   1   0 
3 1  2 11  0 1.0   3   1 
4 1  2 11  0 2.0   3   1 
5 1  2 11  0 0.0   3   1 
6 1  2 11  2 0.0   1   1 

編輯:

最後一排可以改寫太多,如果需要處理更多的列:

def f2(x): 
    #add another code 
    x['date'] = x['date'].diff().fillna(0).dt.days 
    return x 

df = df.groupby(['dis','type','id']).apply(f2) 
+0

我發佈的原始數據是一個groupby對象(不是數據框),根據dis分組,然後輸入id 。我如何根據該分組獲得所需的輸出?謝謝 ! –

+0

只需將'g = df.groupby(['type','date'])''改爲'g = df.groupby(['dis','id','type','date'])''。 – jezrael

+0

我改變了答案 - 因爲通過這個solumn排序也是必要的,並且還在最後一個groupby中添加了列。 – jezrael