我認爲你需要transform
團體的數量大小total_order
,再算上在qty
和最後一個零的個數獲得通過diff
差異與fillna
和days
:
通知 - 差價需要排序的列,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)
秀我們是你迄今爲止所嘗試過的。 –
歡迎來到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
我只針對dis,type和id對數據幀進行了分組,並且我被groupbyobject卡住了。 我無法在不應用任何聚合函數的情況下將groupby對象轉換爲數據框。之前,我正在爲特定日期彙總數量字段以獲取已過去的天數。但我無法弄清楚如何做到這一點,保持我的領域完好無損,只需添加列來獲得所需的輸出 –