我有一個表示時間序列數據的熊貓數據框。我有一個名爲DTDate(日期時間日期)的列和一個名爲line_code(這是觀察單位 - 它恰好是工廠中的生產線)的列。我有很多列的數據,但爲了這個問題,可以想象只有三個:使用GroupBy熊貓摺疊數據
工人 - 生產線上的工人數量。 item - 在生產線上生產的物品的名稱。 輸出 - 生產線上物料的輸出量。
某些日子每行只產生一個項目,有時多個項目。因此,有時每個DTDate/line_code有一個觀測值,有時會有多個觀測值。我需要將每個DTDate/line_code的數據集合合併爲一個觀察值。
這裏是蹭 - 我們還不知道我們想如何聚合數據,因此目前我只需要實現一個結構,我們可以嘗試多個聚合方法。 當行只產生一個項目時,我只需要保留數據行就這樣。當線條在給定的DTDate上生成多個項目時,我想根據以下內容將觀察結果合併爲一個觀察值:
工人:如果在DTDate/line_code觀察值中工人數量相等,則單個值的工作人員正在進入崩潰的集合。如果數字操作員不相等,則創建一個列表對象,其中包含DTDate/line_code觀察值內的所有工作值。 item:項目的列表對象被轉發到摺疊後的集合。 輸出:輸出的列表對象被轉發到摺疊後的集合。
通過讓摺疊集中的列表項目,我將足夠靈活地離開結構,從而讓我自己能夠對每個列進行不同的聚合方法實驗,並且當我被指示達到這種效果時。
SOFAR我已經將數據分組如下:
import pandas as pd
import numpy as np
from pandas import DataFrame
DF = DataFrame(mydata, columns = ['DTDate', 'line_code', \
'workers', 'item', 'output'])
DFGrouped = DF.groupby(['DTDate', 'line_code'])
現在我認識到我所想要做的是以下幾點:
DFAggregated = DFGrouped.agg({'DTDate': max(), 'line_code' : max(), \
'workers' : myfunc1, 'item' : myfunc2, \
'output' : myfunc2})
其中: myfunc1評估中如果所有值指定的列的組是相等的,如果它們是則返回單個值,如果不是,則返回每個值的列表。
myfunc2返回指定列內組中所有值的列表。
我的問題是,我沒有idead如何編寫這些函數,很大程度上,因爲我不清楚如何遍歷組特定的索引/行。我已閱讀關於grouby等的python文檔,但發現它不是非常有用。我意識到我應該發佈更多我嘗試過的代碼,但我很難在這裏站穩腳跟。任何指針將不勝感激。
(現在延伸到給說明性功能代碼)
Incidentall我希望myfunc1和myfunc2所看起來是這樣的:
def myfunc1(ColName):
if len(set([DFGroup[ColName][x] for x in DFGroup.index])) == 1:
return DFGroup[ColName].max()
else:
return [DFGroup[ColName][x] for x in DFGroup.index]
def myfunc2(ColName):
return [DFGroup[ColName][x] for x in DFGroup.index]
,你可以看到,我不知道如何來指代團體索引等
其中參數x是列int int DF?謝謝這是有幫助的。看來我不需要實際遍歷每個組中的索引。如果有必要的話,會怎麼做?應用程序似乎也可能有用,而且似乎也以同樣的方式用於保密。我現在看看。非常感謝。 –
@WoodyPride:正如我所說的,函數的參數(在我的例子中是'x')是一個包含列數據的pandas Series。您可以像對待任何Series一樣對它迭代或做任何事情。 – BrenBarn
明白了,謝謝! –